int sigwaitinfo(const sigset_t *set, siginfo_t *info);
int sigtimedwait(const sigset_t *set, siginfo_t *info, const struct timespec timeout);
ОПИСАНИЕ
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, то исполняется poll:
sigtimedwait()
немедленно завершает работу, либо с информацией о сигнале,
предназначенном вызывающему, либо с ошибкой если ни один из сигналов в наборе
set
не был для него предназначен
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
При нормальном завершении работы и
sigwaitinfo()
и
sigtimedwait()
возвращают номер сигнала (т.е. значение больше нуля).
При ошибках оба вызова возвращают -1 и переменная
errno
устанавливается соответственно ошибке.
НАЙДЕННЫЕ ОШИБКИ
EAGAIN
Ни одного сигнала в указанном наборе
set
не было доставлено за время
timeout,
указанном для
sigtimedwait().
EINVAL
timeout
некорректно.
EINTR
Ожидание было прервано обработчиком сигнала.
(Этот обработчик был для другого сигнала, не из набора
set.)
ЗАМЕЧАНИЯ
При обычном использовании вызывающий блокирует сигналы в наборе
set
через соответствующие вызовы
sigprocmask()
(так, чтобы поведение по умолчанию для этих сигналов не сработало,
если они доставлены межде успешными вызовами
sigwaitinfo()
или
sigtimedwait())
и не устанавливает обработчики для этих сигналов.
POSIX оставляет неопределенным значение
NULL
аргумента
timeout
для
sigtimedwait(),
допуская возможность того, что он имеет такое же значение, как и вызов к
sigwaitinfo(),
в самом деле это именно так в Linux.