sigqueue(2) - Linux 手册页

名称

sigqueue, rt_sigqueueinfo - 将信号和数据发送到进程

概要

#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() 向 PID 为 pid 的进程发送 sig 指定的信号。发送信号所需的权限与 kill(2) 相同。与 kill(2) 一样,空信号 (0) 可用于检查具有给定 PID 的进程是否存在。

value 参数用于指定与信号一起发送的伴随数据项(整数或指针值),其类型如下

union sigval {
    int   sival_int;
    void *sival_ptr;
};
如果接收进程使用 SA_SIGINFO 标志安装了此信号的处理程序到 sigaction(2),那么它可以通过作为第二个参数传递给处理程序的 siginfo_t 结构的 si_value 字段获取此数据。此外,该结构的 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(),并且其第三个参数不同,该参数是将被提供给接收进程的信号处理程序或由接收进程的 sigtimedwait(2) 调用返回的 siginfo_t 结构。在 glibc sigqueue() 包装器内部,此参数 info 如下初始化

info.si_signo = sig;      /* argument supplied to sigqueue() */
info.si_code = SI_QUEUE;
info.si_pid = getpid();   /* Process ID of sender */
info.si_uid = getuid();   /* Real UID of sender */
info.si_value = val;      /* argument supplied to sigqueue() */

参见

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

引用自

killpg(3)