Книга: Разработка приложений в среде Linux. Второе издание
12.2.6. Ожидание сигналов
12.2.6. Ожидание сигналов
Когда программа построена преимущественно вокруг сигналов, часто необходимо, чтобы она ожидала появления какого-то сигнала, прежде чем продолжать работу. Системный вызов pause()
предоставляет простую возможность для этого.
#include <unistd.h>
int pause(void);
Функция pause()
не возвращает управления до тех пор, пока сигнал не будет доставлен процессу. Если зарегистрирован обработчик для этого сигнала, то он запускается до того, как pause()
вернет управление, pause()
всегда возвращает -1
и устанавливает errno
равным EINTR
.
Системный вызов sigsuspend()
предлагает альтернативный метод ожидания вызова сигнала.
#include <signal.h>
int sigsuspend(const sigset_t *mask);
Как и pause()
, sigsuspend()
временно приостанавливает процесс до тех пор, пока не будет получен сигнал (и обработан связанным с ним обработчиком, если таковой предусмотрен), возвращая -1
и устанавливая errno
в EINTR
.
В отличие от pause()
, sigsuspend()
временно устанавливает маску сигналов процесса в значение, находящееся по адресу, указанному в mask
, на период ожидания появления сигнала. Как только сигнал поступает, маска сигналов восстанавливается в то значение, которое она имела до вызова sigsuspend()
. Это позволяет процессу ожидать появления определенного сигнала за счет блокирования всех остальных сигналов[63].
- 12.2. Программный интерфейс сигналов Linux и POSIX
- 12.2.5. Нахождение набора ожидающих сигналов
- 7.4. Аналоговые перемножители сигналов
- 15.1.3. Обработка сигналов управления заданиями
- Пример: обработчик управляющих сигналов консоли
- 10.6.4. Перехват сигналов: sigaction()
- 19.7.9. Обработка сигналов и протоколирование
- Ожидание процесса
- Глава пятая. Затянувшееся ожидание
- 10.6.3. Управление маской сигналов: sigprocmask() и др.
- Листинг 5.4. (sem_pv.c) Ожидание и установка двоичного семафора
- 13.2.7. Ожидание события