SIGPROCMASK - Linux手册页
Linux程序员手册 第2部分
更新日期: 2017-09-15
名称
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
说明
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()成功返回0,错误返回-1。如果发生错误,则设置errno来指示原因。
错误说明
- EFAULT
- set或oldset参数指向进程分配的地址空间之外。
- EINVAL
- 在how中指定的值无效,或者内核不支持sigsetsize中传递的大小。
遵循规范
POSIX.1-2001,POSIX.1-2008。
备注
无法阻止SIGKILL或SIGSTOP。这样做的尝试被默默忽略。
进程中的每个线程都有其自己的信号掩码。
通过fork(2)创建的子级继承其父级信号掩码的副本;信号掩码在execve(2)中保留。
如果SIGBUS,SIGFPE,SIGILL或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()。
另外参见
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/。