SIGWAITINFO(2)

ИМЯ
sigwaitinfo, sigtimedwait - синхронно ожидать запрошенные сигналы

ОБЗОР
#include <signal.h>

int sigwaitinfo(const sigset_t *set, siginfo_t *info);

int sigtimedwait(const sigset_t *set, siginfo_t *info,
                 const struct timespec *timeout);

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

sigwaitinfo(), sigtimedwait(): _POSIX_C_SOURCE >= 199309L

ОПИСАНИЕ
sigwaitinfo() приостанавливает исполнение вызывающий нити до тех пор, пока не будет получен один из сигналов из набора set. ((Если один из сигналов в set уже ожидает обработки вызывающей нитью, то sigwaitinfo() завершит работу немедленно с возвратом информации об этом сигнале.) sigwaitinfo() удаляет доставленный сигнал из списка сигналов для обработки и возвращает номер сигнала как результат работы функции. Если аргумент info не равен NULL, то возвращается структура типа siginfo_t (см. sigaction(2)), содержащая информацию о сигнале.

Сигналы, возвращенные через sigwaitinfo(), доставляются обычным порядком; подробности можно прочитать в signal(7).

Системный вызов sigtimedwait() работает аналогично sigwaitinfo(), за исключением того, что он имеет дополнительный аргумент timeout, задающий минимальный интервал, на который приостанавливается процесс в ожидании сигнала. Данное значение интервала будет округлено до точности системных часов, а из-за задержки при планировании в ядре блокирующий интервал будет немного больше. Этот аргумент имеет следующий тип:

struct timespec {
    long    tv_sec;         /* секунды */
    long    tv_nsec;        /* наносекунды */
}

Если оба поля структуры равны 0, то исполняется опрос: sigtimedwait() немедленно завершает работу, либо с информацией о сигнале, предназначенном вызывающему, либо с ошибкой, если ни один из сигналов в наборе set не ожидает обработки.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При нормальном завершении работы sigwaitinfo() и sigtimedwait() возвращают номер сигнала (т.е. значение больше нуля). При ошибках оба вызова возвращают -1 и переменная errno устанавливается соответственно ошибке.

ОШИБКИ

EAGAIN
    Ни одного сигнала в указанном наборе set не было доставлено за время timeout, указанном для sigtimedwait().

EINTR
    Ожидание было прервано обработчиком сигнала; см. signal(7). (Этот обработчик был для другого сигнала, не из набора set.)

EINVAL
    Значение timeout некорректно.

СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001.

ЗАМЕЧАНИЯ
При обычном использовании вызывающая программа блокирует сигналы в наборе set через предыдущий вызов sigprocmask(2) (так, чтобы поведение по умолчанию для этих сигналов не сработает, если они доставлены между успешными вызовами sigwaitinfo() или sigtimedwait()) и не устанавливает обработчики для этих сигналов. В многонитиевых программах сигнал должен быть заблокирован во всех нитях для предотвращения возврата сигнала нити, отличной от той, которая вызвала sigwaitinfo() или sigtimedwait()). Набор сигналов, ожидающих обработки в заданной нити, представляет собой объединение набора сигналов, ожидающих обработки именно в этой нити и набора сигналов, ожидающих обработки всем процессом (см. signal(7)). Попытки ожидания SIGKILL и SIGSTOP просто игнорируются. Если несколько нитей процесса заблокированы в ожидании одного сигнала(ов) в sigwaitinfo() или sigtimedwait(), то только одна нить действительно получить сигнал, если он доставляется всему процессу; какая именно нить получит сигнал неизвестно. POSIX оставляет неопределённое значение NULL в аргументе timeout для sigtimedwait(), допуская возможность того, что он имеет такое же значение, как и у вызова sigwaitinfo(), и в самом деле это именно так в Linux. В Linux, sigwaitinfo() реализована в виде библиотечной функции, использующей sigtimedwait().

СМОТРИТЕ ТАКЖЕ
kill(2), sigaction(2), signal(2), signalfd(2), sigpending(2), sigprocmask(2), sigqueue(3), sigsetops(3), sigwait(3), signal(7), time(7)