Scroll to navigation

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

ИМЯ

sigqueue - вставляет сигнал и данные в очередь процесса

СИНТАКСИС

#include <signal.h>

int sigqueue(pid_t pid, int sig, const union sigval value);

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

sigqueue(): _POSIX_C_SOURCE >= 199309L

ОПИСАНИЕ

Вызов sigqueue() отправляет сигнал, указанный в sig, процессу с идентификатором PID, определённом в pid. Требуются определённые права для отправки сигнала, такие же как для kill(2). Как и в случае с kill(2), пустой сигнал (0) может использоваться для проверки того, что заданный PID вообще существует.

Аргумент value используется для указания сопутствующего элемента данных (либо целого, либо указателя), отправляемых сигналу, и имеет следующий тип:


union sigval {

int sival_int;
void *sival_ptr; };

Если у процесса, принимающего сигнал, установлен обработчик посредством sigaction(2) с флагом SA_SIGINFO, то он может получить данные через поле si_value структуры siginfo_t, передаваемой как второй аргумент для обработчика. Кроме этого, значение поля si_code этой структуры будет установлено в SI_QUEUE.

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

При успешном выполнении sigqueue() возвращается 0, что означает, что сигнал попал в очередь принимающего процесса. При ошибке возвращается -1 и в errno содержится код ошибки.

ОШИБКИ

Достигнуто ограничение на количество сигналов в очереди (подробней об этом смотрите в signal(7)).
Значение sig некорректно.
Процесс не имеет прав для отправки сигнала принимающему процессу. Требуемые права смотрите в kill(2).
Нет процесса с идентификатором PID, соответствующем указанному pid.

ВЕРСИИ

Функция sigqueue() и используемый ей системный вызов rt_sigqueueinfo() впервые появились в Linux 2.2.

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).

Интерфейс Атрибут Значение
sigqueue() Безвредность в нитях MT-Safe

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

POSIX.1-2001, POSIX.1-2008.

ЗАМЕЧАНИЯ

Если этот вызов приводит к отправке сигнала процессу, который его вызвал, и этот сигнал не заблокирован вызывающей нитью, и никакие другие нити не желают обрабатывать сигнал (либо он для них не заблокирован, либо они ожидали его с помощью sigwait(3), то, по меньшей мере, сигнал должен быть доставлен этой нити до завершения этого вызова.

Отличия между библиотекой C и ядром

В Linux sigqueue() реализована через системный вызов rt_sigqueueinfo(2). Данный системный вызов отличается от неё третьим аргументом: структура siginfo_t, которая будет предоставляться обработчику сигнала принимающего процесса или возвращаться вызовом sigtimedwait(2) из принимающего процесса. В обёрточной функции glibc sigqueue() этот аргумент, uinfo, инициализируется следующим образом:


uinfo.si_signo = sig;      /* аргумент, передаваемый в sigqueue() */
uinfo.si_code = SI_QUEUE;
uinfo.si_pid = getpid();   /* ID процесса отправителя */
uinfo.si_uid = getuid();   /* реальный UID отправителя */
uinfo.si_value = val;      /* аргумент, передаваемый в sigqueue() */

СМ. ТАКЖЕ

kill(2), rt_sigqueueinfo(2), sigaction(2), signal(2), pthread_sigqueue(3), sigwait(3), signal(7)

ЗАМЕЧАНИЯ

Эта страница является частью проекта Linux man-pages версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу https://www.kernel.org/doc/man-pages/.

ПЕРЕВОД

Русский перевод этой страницы руководства был сделан Alexander Golubev <fatzer2@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Hotellook, Nikita <zxcvbnm3230@mail.ru>, Spiros Georgaras <sng@hellug.gr>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.

15 сентября 2017 г. Linux