table of contents
rt_sigqueueinfo(2) | System Calls Manual | rt_sigqueueinfo(2) |
ИМЯ¶
rt_sigqueueinfo, rt_tgsigqueueinfo - ставит сигнал и данные в очередь
LIBRARY¶
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 не найдена.
СТАНДАРТЫ¶
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 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.
Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику по его адресу электронной почты или по адресу списка рассылки русских переводчиков.
2 мая 2024 г. | Linux man-pages (unreleased) |