Scroll to navigation

SIGWAITINFO(2) Руководство программиста Linux 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 устанавливается соответственно ошибке.

ОШИБКИ

Ни одного сигнала в указанном наборе set не было доставлено за время timeout, указанном для sigtimedwait().
Ожидание было прервано обработчиком сигнала; см. signal(7). (Этот обработчик был для другого сигнала, не из набора set.)
Значение 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)

2012-05-02 Linux