rt_sigqueueinfo, rt_tgsigqueueinfo -
ставит
сигнал и
данные в
очередь
Standard C library (
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).
Системный
вызов
rt_sigqueueinfo()
отправляет
сигнал
sig
группе
нитей с
идентификатором
tgid (термин
«группа
нитей»
является
синонимом
«процесс»,
а
tid
соответствует
обычному
идентификатору
процесса UNIX).
Сигнал
будет
доставлен
произвольному
члену
группы
нитей (т. е.,
одной из
нитей,
которая в
этот
момент не
блокирует
сигнал).
В
аргументе
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
- Достигнуто
ограничение
на
количество
сигналов в
очереди
(подробней
об этом
смотрите в
signal(7)).
- EINVAL
- Некорректное
значение
sig, tgid или tid.
- EPERM
- Вызывающий
не имеет
прав для
отправки
сигнала по
назначению.
Требуемые
права
смотрите в
kill(2).
- EPERM
- В tgid
указан
процесс,
отличный
от
вызывающего
и значение
info->si_code
некорректно.
- ESRCH
-
rt_sigqueueinfo():
Группа
нитей tgid не
найдена.
rt_tgsigqueinfo(): Нить
tid
из
tgid не
найдена.
The
rt_sigqueueinfo() system call was added in Linux 2.2. The
rt_tgsigqueueinfo() system call was added in Linux 2.6.31.
Данные
системные
вызовы
есть
только в Linux.
Поскольку
системные
вызовы не
предназначены
для
приложений,
в 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 <
[email protected]>, Azamat Hackimov
<
[email protected]>, Dmitriy S. Seregin <
[email protected]>,
Katrin Kutepova <
[email protected]>, Lockal
<
[email protected]>, Yuri Kozlov <
[email protected]>,
Баринов
Владимир и
Иван
Павлов <
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]