SIGQUEUE - Linux手册页

时间:2019-08-20 18:01:20  来源:igfitidea点击:

Linux程序员手册 第3部分
更新日期: 2017-09-15

名称

sigqueue-将信号和数据排队到进程

语法

#包括

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标志为该信号安装了处理程序,则它可以通过siginfo_t结构的si_value字段(作为第二个参数传递给该处理程序)获取此数据。此外,该结构的si_code字段将设置为SI_QUEUE。

返回值

成功后,sigqueue()返回0,表示信号已成功排队到接收进程中。否则,返回-1并将errno设置为指示错误。

错误说明

EAGAIN
已达到可排队的信号限制。 (有关更多信息,请参见signal(7)。)
EINVAL
信号无效。
EPERM
该过程无权将信号发送到接收过程。有关所需的权限,请参见kill(2)。
ESRCH
没有进程具有PID匹配pid。

版本

sigqueue()和基础的rt_sigqueueinfo()系统调用首先出现在Linux 2.2中。

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
sigqueue()Thread safetyMT-Safe

遵循规范

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

备注

如果此函数导致向调用它的进程发送信号,并且该信号未被调用线程阻塞,并且没有其他线程愿意处理此信号(通过解除阻塞或等待该信号)使用sigwait(3)),则在此函数返回之前,必须至少向该线程传递一些信号。

C library/kernel differences

在Linux上,sigqueue()是使用rt_sigqueueinfo(2)系统调用实现的。系统调用的第三个参数不同,它是siginfo_t结构,该结构将提供给接收进程的信号处理程序,或由接收进程的sigtimedwait(2)调用返回。在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)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/