sigqueue()

Отправить сигнал группе процессов, процессу или потоке

Прототип:

#include <signal.h>
int sigqueue ( pid_t pid,
int signo,
const union sigval value );

Аргументы:

pid
Идентификатор процесса, которому требуется отправить сигнал.
signo
Нуль или номер сигнала, который требуется поместить в очередь сигналов процесса. Для получения дополнительной информации см. сигналы POSIX в документации к SignalAction().
value
Значение для отправки с сигналом.

Библиотека:

libc

Описание:

Функция sigqueue() инициирует отправку сигнала signo с указанным значением value в процесс pid. Если signo равен нулю, выполняется проверка ошибок, но фактически сигнал не посылается. Это один из способов проверить, корректен ли pid.

Условие разрешения процессу поместить сигнал в очередь другого процесса, такое же, как и для функции kill() — реальный или эффективный идентификатор пользователя отправляющего процесса должен совпадать с реальным или эффективным идентификатором пользователя для принимающего процесса.

Функция sigqueue() немедленно завершается. Если для signo установлен SA_SIGINFO и доступны ресурсы для постановки сигнала в очередь, он ставится в очередь и отправляется принимающему процессу. Если SA_SIGINFO не установлен для signo, то signo отправляется принимающему процессу, если сигнал еще не в очереди.

Если pid приводит к передаче signo и если signo не заблокирован в вызывающем потоке, а также ни один другой поток не имеет разблокированного signo и не ожидает в функции sigwait() для получения signo, тогда signo или один ожидающий разблокированный сигнал доставляется в вызывающий поток перед выходом из sigqueue().

Если для доставки выбран один из нескольких ожидающих сигналов в диапазоне от SIGRTMIN до SIGRTMAX, доставляется сигнал с наименьшим номером. Порядок выбора между сигналами реального времени и остальными, а также между несколькими ожидающими сигналами вне реального времени не определен.

Возвращаемое значение:

0
Успешное завершение.
-1
Возникла ошибка. Код ошибки записан в errno.

Коды ошибок:

EAGAIN
Нет доступных ресурсов для постановки сигнала в очередь. Процесс уже поставил в очередь максимальное количество сигналов, которое определяется командой: sysconf( _SC_SIGQUEUE_MAX ). Они все еще находятся в ожидании у получателя(-ей), либо превышен лимит общесистемных ресурсов.
EINVAL
Номер сигнала signo является недопустимым или не поддерживается.
ENOSYS
Данная реализация не поддерживает функцию sigqueue().
EPERM
У процесса нет соответствующих привилегий для отправки сигнала принимающему процессу.
ESRCH
Процесс с заданным pid не существует.

Классификация:

POSIX 1003.1 Realtime Signals Extension

Безопасность использования
Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

kill(), signal(), SignalAction()




Предыдущий раздел: Описание API системной библиотеки