rt_sigqueueinfo(2)

НАИМЕНОВАНИЕ
rt_sigqueueinfo, rt_tgsigqueueinfo - ставит сигнал и данные в очередь

БИБЛИОТЕКА
Стандартная библиотека языка C (libc, -lc)

ОБЗОР
#include <linux/signal.h>     /* определения констант SI_* */
#include <sys/syscall.h>      /* определения констант SYS_* */
#include <unistd.h>

int syscall(SYS_rt_sigqueueinfo, pid_t tgid,
            int sig, siginfo_t *info);
int syscall(SYS_rt_tgsigqueueinfo, pid_t tgid, pid_t tid,
            int sig, siginfo_t *info);

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

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

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

The rt_sigqueueinfo() system call sends the signal sig to the thread group with the ID tgid. (The term "thread group" is synonymous with "process", and tgid corresponds to the traditional UNIX process ID.) The signal will be delivered to an arbitrary member of the thread group (i.e., one of the threads that is not currently blocking the signal).

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

si_code
    Значением должен быть один из кодов SI_*, перечисленных в файле исходного кода ядра Linux include/asm-generic/siginfo.h. посылается любому процессу, но не самому вызывающему, то накладываются следующие ограничения:

    •   Значение кода не может быть больше или равно нулю. В частности нельзя указывать SI_USER, используемый ядром для обозначения того, что сигнал послан kill(2), и нельзя указать SI_KERNEL, который используется для обозначения того, что сигнал сгенерирован ядром.

    •   Кодом не может быть (начиная с Linux 2.6.39) SI_TKILL, который используется ядром для обозначения того, что сигнал послан с помощью tgkill(2).

si_pid
    Должно хранить идентификатор процесса, обычно PID отправителя.

si_uid
    Должно хранить идентификатор пользователя, обычно UID реального пользователя отправителя.

si_value
    Это поле хранит пользовательские данные, сопровождающие сигнал. Подробности смотрите в описании последнего аргумента (union sigval) функции sigqueue(3).

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

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

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении эти системные вызовы возвращают 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение ошибки.

ОШИБКИ

EAGAIN
    The limit of signals that may be queued has been reached. (See signal(7) for further information.)

EINVAL
    Некорректное значение sig, tgid или tid.

EPERM
    Вызывающий не имеет прав для отправки сигнала по назначению. Требуемые права смотрите в kill(2).

EPERM
    В tgid указан процесс, отличный от вызывающего и значение info->si_code некорректно.

ESRCH
    rt_sigqueueinfo(): Группа нитей tgid не найдена.

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

СТАНДАРТЫ
Linux.

ИСТОРИЯ

rt_sigqueueinfo()
    Linux 2.2.

rt_tgsigqueueinfo()
    Linux 2.6.31.

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

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

СМОТРИТЕ ТАКЖЕ
kill(2), pidfd_send_signal(2), sigaction(2), sigprocmask(2), tgkill(2), pthread_sigqueue(3), sigqueue(3), signal(7)

ПЕРЕВОД
Русский перевод этой страницы руководства разработал(и) aereiae <aereiae@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>, Katrin Kutepova <blackkatelv@gmail.com>, Lockal <lockalsash@gmail.com>, Yuri Kozlov <yuray@komyakino.ru>, Баринов Владимир и Иван Павлов <pavia00@gmail.com>

Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков (<debian-l10n-russian@lists.debian.org>).