错误说明

EFAULT
set或oldset参数指向进程分配的地址空间之外。
EINVAL
在how中指定的值无效,或者内核不支持sigsetsize中传递的大小。

返回值

sigprocmask()成功返回0,错误返回-1。如果发生错误,则设置errno来指示原因。

备注

无法阻止SIGKILL或SIGSTOP。这样做的尝试被默默忽略。

进程中的每个线程都有其自己的信号掩码。

通过fork(2)创建的子级继承其父级信号掩码的副本;信号掩码在execve(2)中保留。

如果SIGBUSSIGFPE,SoirLL或SIGSEGV在被阻止时生成,则结果是不确定的,除非信号是由kill(2),sigqueue(3)或raise(3)生成的。

有关操纵信号集的详细信息,请参见sigsetops(3)。

请注意,将set和oldset都指定为NULL是允许的(尽管不是很有用)。

C library/kernel differences

内核对sigset_t的定义与C库使用的大小不同。在本手册页中,前者称为kernel_sigset_t(但是在内核源代码中仍称为sigset_t)。

sigprocmask()的glibc包装函数默默地忽略了试图阻止NPTL线程实现内部使用的两个实时信号的尝试。有关详细信息,请参见nptl(7)。

最初的Linux系统调用名为sigprocmask()。但是,在Linux 2.2中添加了实时信号后,该系统调用支持的固定大小的32位sigset_t(在本手册页中称为old_kernel_sigset_t)不再适用。因此,添加了新的系统调用rt_sigprocmask()以支持扩展的sigset_t类型(在本手册页中称为kernel_sigset_t)。新的系统调用采用第四个参数size_t sigsetsize,它指定set和oldset中信号集的大小(以字节为单位)。当前要求此参数具有固定的体系结构特定值(等于sizeof(kernel_sigset_t))。

glibc sigprocmask()包装器函数向我们隐藏了这些详细信息,在内核提供时透明地调用rt_sigprocmask()。

语法

#包括

/* Prototype for the glibc wrapper function */
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

/* Prototype for the underlying system call */
int rt_sigprocmask(int how, const kernel_sigset_t *set,
                   kernel_sigset_t *oldset, size_t sigsetsize);

/* Prototype for the legacy system call (deprecated) */
int sigprocmask(int how, const old_kernel_sigset_t *set,
                old_kernel_sigset_t *oldset);

glibc的功能测试宏要求(请参阅feature_test_macros(7)):

sigprocmask():_ POSIX_C_SOURCE

另外参见

kill(2),pause(2),sigaction(2),signal(2),sigpending(2),sigsuspend(2),pthread_sigmask(3),sigqueue(3),sigsetops(3),signal(7)

出版信息

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

名称

sigprocmask,rt_sigprocmask-检查并更改阻止的信号

说明

sigprocmask()用于获取和/或更改调用线程的信号掩码。信号掩码是当前被呼叫者阻止传递的信号集(有关更多详细信息,另请参见signal(7))。

调用的行为取决于how的值,如下所示。

SIG_BLOCK
被阻止信号的集合是当前集合和集合参数的并集。
SIG_UNBLOCK
集合中的信号将从当前的阻塞信号集中删除。允许尝试解锁未被阻止的信号。
SIG_SETMASK
阻塞信号集被设置为参数集。

如果oldset为非NULL,则信号掩码的先前值存储在oldset中。

如果set为NULL,则信号掩码不变(即如何被忽略),但是信号掩码的当前值仍然以oldset返回(如果不是NULL)。

sigsetops(3)中描述了一组用于修改和检查sigset_t类型的变量("信号集")的函数。

在多线程进程中,未指定sigprocmask()的使用。请参见pthread_sigmask(3)。

SIGPROCMASK - Linux手册页

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

遵循规范

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

日期:2019-08-20 17:59:17 来源:oir作者:oir