sigqueue(3) - Linux 手册页

名称

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;
};
如果接收进程使用 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(2) 系统调用实现。该系统调用在其第三个参数上有所不同,该参数是将被提供给接收进程的信号处理程序或由接收进程的 sigtimedwait(2) 调用返回的 siginfo_t 结构。在 glibc sigqueue() 包装器内部,此参数 uinfo 如下初始化

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

参见

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

引用自

credentials(7), getrlimit(2), psignal(3), ptrace(2), signalfd(2), sigprocmask(2)