RT_SIGQUEUEINFO(2) Руководство программиста Linux RT_SIGQUEUEINFO(2)

ИМЯ

rt_sigqueueinfo, rt_tgsigqueueinfo - ставит сигнал и данные в очередь

ОБЗОР

int rt_sigqueueinfo(pid_t tgid, int sig, siginfo_t *uinfo);
int rt_tgsigqueueinfo(pid_t tgid, pid_t tid, int sig,
                      siginfo_t *uinfo);

Замечание: В glibc нет обёрточных функций для этих системных вызовов; смотрите ЗАМЕЧАНИЯ.

ОПИСАНИЕ

Системные вызовы rt_sigqueueinfo() и rt_tgsigqueueinfo() предоставляют низкоуровневый интерфейс для отправки сигнала с данными процессу или нити. Приёмник сигнала может получить сопутствующие данные, установив обработчик сигнала с помощью sigaction(2) с флагом SA_SIGINFO.

Данные системные вызовы не предназначены для использования непосредственно из приложения; они нужны для реализации библиотечных функций sigqueue(3) и pthread_sigqueue(3).

Системный вызов rt_sigqueueinfo() отправляет сигнал sig группе нитей с идентификатором tgid (термин «группа нитей» является синонимом «процесс», а tid соответствует обычному идентификатору процесса UNIX). Сигнал будет доставлен произвольному члену группы нитей (т. е., одной из нитей, которая в этот момент не блокирует сигнал).

В аргументе uinfo задаются сопутствующие сигналу данные. Этот аргумент является указателем на структуру типа siginfo_t, описанную в sigaction(2) (и определённую в <sigaction.h>). Вызывающий должен заполнить следующие поля структуры:

Значением должен быть один из кодов SI_*, перечисленных в файле исходного кода ядра Linux include/asm-generic/siginfo.h, имеющих отрицательное значение (т. е., нельзя указать SI_USER, используемый ядром для обозначения того, что сигнал послан kill(2)) и нельзя указать (начиная с Linux 2.6.39) SI_TKILL (используется ядром для обозначения того, что сигнал послан tgkill(2)).
Должно хранить идентификатор процесса, обычно PID отправителя.
Должно хранить идентификатор пользователя, обычно UID реального пользователя отправителя.
Это поле хранит пользовательские данные, сопровождающие сигнал. Подробности смотрите в описании последнего аргумента (union sigval) функции sigqueue(3).

Внутри ядра полю si_signo устанавливается значение, переданное в sig, так что получатель сигнала может также получить его номер через это поле.

Системный вызов rt_tgsigqueueinfo() похож на rt_sigqueueinfo(), но посылает сигнал и данные одной нити, указываемой комбинацией tgid — идентификатором группы нитей — и tid — нити из этой группы.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении эти системные вызовы возвращают 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение ошибки.

ОШИБКИ

Достигнуто ограничение на количество сигналов в очереди (подробней об этом смотрите в signal(7)).
Некорректное значение sig, tgid или tid.
Вызывающий не имеет прав для отправки сигнала по назначению. Требуемые права смотрите в kill(2). Или некорректное значение uinfo->si_code.
rt_sigqueueinfo(): Группа нитей tgid не найдена.

rt_tgsigqueinfo(): Нить tid из tgid не найдена.

ВЕРСИИ

Системный вызов rt_sigqueueinfo() был добавлен в Linux версии 2.2. Системный вызов rt_tgsigqueueinfo() был добавлен в Linux версии 2.6.31.

СООТВЕТСТВИЕ СТАНДАРТАМ

Данные системные вызовы есть только в Linux.

ЗАМЕЧАНИЯ

Поскольку системные вызовы не предназначены для приложений, в glibc для них нет обёрточных функций. Используйте syscall(2) в том маловероятном случае, если вы хотите вызывать их напрямую.

Как и в случае с kill(2), может быть использован сигнал null (0), чтобы проверить, существует ли указанный процесс или нить.

СМОТРИТЕ ТАКЖЕ

kill(2), sigaction(2), sigprocmask(2), tgkill(2), pthread_sigqueue(3), sigqueue(3), signal(7)

2017-09-15 Linux