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)