table of contents
        
      
      
    | 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 содержится код ошибки.
ОШИБКИ¶
- EAGAIN
- Достигнуто ограничение на количество сигналов в очереди (подробней об этом смотрите в signal(7)).
- EINVAL
- Значение sig некорректно.
- EPERM
- Процесс не имеет прав для отправки сигнала принимающему процессу. Требуемые права смотрите в kill(2).
- ESRCH
- Нет процесса с идентификатором PID, соответствующем указанному pid.
ВЕРСИИ¶
Системный вызов впервые появился в Linux 2.2.
СООТВЕТСТВИЕ СТАНДАРТАМ¶
POSIX.1-2001.
ЗАМЕЧАНИЯ¶
Если этот вызов приводит к отправке сигнала процессу, который его вызвал, и этот сигнал не заблокирован вызывающей нитью, и никакие другие нити не желают обрабатывать сигнал (либо он для них не заблокирован, либо они ожидали его с помощью sigwait(3), то, по меньшей мере, сигнал должен быть доставлен этой нити до завершения этого вызова.
В Linux эта
    функция
    реализована
    через
    системный
    вызов 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)
| 2012-03-25 | Linux |