ОБЗОР
#include <signal.h>
int sigqueue(pid_t pid, int sig, const union sigval value);
Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):
sigqueue(): _POSIX_C_SOURCE >= 199309L
ОПИСАНИЕ
Вызов sigqueue() отправляет сигнал, указанный в sig, процессу с
идентификатором PID, определённом в pid. Требуются определённые права для
отправки сигнала, такие же как для kill(2). Как и в случае с kill(2),
пустой сигнал (0) может использоваться для проверки того, что заданный PID
вообще существует.
Аргумент value используется для указания сопутствующего элемента данных (либо целого, либо указателя), отправляемых сигналу, и имеет следующий тип:
union sigval { int sival_int; void *sival_ptr; };
Если у процесса, принимающего сигнал, установлен обработчик посредством sigaction(2) с флагом SA_SIGINFO, то он может получить данные через поле si_value структуры siginfo_t, передаваемой как второй аргумент для обработчика. Кроме этого, значение поля si_code этой структуры будет установлено в SI_QUEUE.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении sigqueue() возвращается 0, что означает, что
сигнал попал в очередь принимающего процесса. При ошибке возвращается -1 и в
errno содержится код ошибки.
ОШИБКИ
EAGAIN Достигнуто ограничение на количество сигналов в очереди (подробней об этом смотрите в signal(7)).
EINVAL Значение sig некорректно.
EPERM Процесс не имеет прав для отправки сигнала принимающему процессу. Требуемые права смотрите в kill(2).
ESRCH Нет процесса с идентификатором PID, соответствующем указанному pid.
ВЕРСИИ
Функция sigqueue() и используемый ей системный вызов rt_sigqueueinfo() впервые появились в Linux 2.2.
АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).
Интерфейс Атрибут Значение
sigqueue()
безвредность в потоках: безвредно (MT-Safe)
СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008.
ЗАМЕЧАНИЯ
Если этот вызов приводит к отправке сигнала процессу, который его вызвал, и
этот сигнал не заблокирован вызывающей нитью, и никакие другие нити не
желают обрабатывать сигнал (либо он для них не заблокирован, либо они
ожидали его с помощью sigwait(3), то, по меньшей мере, сигнал должен быть
доставлен этой нити до завершения этого вызова.
Отличия между библиотекой C и ядром
В Linux sigqueue() реализована через системный вызов rt_sigqueueinfo(2). Данный системный вызов отличается от неё третьим аргументом: структура siginfo_t, которая будет предоставляться обработчику сигнала принимающего процесса или возвращаться вызовом sigtimedwait(2) из принимающего процесса. В обёрточной функции glibc sigqueue() этот аргумент, uinfo, инициализируется следующим образом:uinfo.si_signo = sig; /* аргумент, передаваемый в sigqueue() */ uinfo.si_code = SI_QUEUE; uinfo.si_pid = getpid(); /* ID процесса отправителя */ uinfo.si_uid = getuid(); /* реальный UID отправителя */ uinfo.si_value = val; /* аргумент, передаваемый в sigqueue() */