对于sigismember来说,如果 signum 是 set 的成员,则返回 1,如果 signum 不是 set 的成员,则返回 0,错误时返回 -1。
堕落时,这些函数会设置 errno 以指示原因。
3、sigprocmask函数
(1)函数
(2)描述
sigprocmask函数用于获取和/或更改调用线程的信号掩码。
sigprocmask函数调用的举动取决于 how 的值。
如果 oldset 为非 NULL,则信号掩码的上一个值将存储在 oldset 中。
如果 set 为 NULL,则信号掩码保持不变(即忽略 how),但信号掩码的当前值仍通过 oldset 返回(如果它不是 NULL)。
(3)参数how的有效值
SIG_BLOCK:阻塞信号集将被设置为当前信号集和参数 set 的并集,即将 set 中包罗的信号都阻塞。
SIG_UNBLOCK:参数 set 聚集中的信号将从当前受阻信号集中移除,即 set 中包罗的信号将被设置为不阻塞。 答应实验解锁未被阻塞的信号。
SIG_SETMASK:将阻塞信号集的内容设置为参数 set 的内容。
4、sigpending函数
(1)函数
(2)描述
sigpending函数返回等待传送到调用线程的信号集(即在被阻塞时引发的信号)。
挂起信号的掩码在参数set中返回。
5、示例代码
#include<iostream>
#include<unistd.h>
#include<signal.h>
using namespace std;
void PrintSignal(const sigset_t& pending)
{
for(int i = 31; i >= 1; --i)
{
if(sigismember(&pending, i))
cout << "1";
else
cout << "0";
}
cout << "\n" << endl;
}
int main()
{
sigset_t bset, oset;
sigemptyset(&bset);
sigemptyset(&oset);
for(int i = 1; i <= 31; ++i)
{
sigaddset(&bset, i);
}
sigprocmask(SIG_SETMASK, &bset, &oset);
sigset_t pending;
sigemptyset(&pending);
while(true)
{
int ret = sigpending(&pending);
if(ret == -1)
continue;
PrintSignal(pending);
sleep(1);
}
return 0;
}
复制代码
五、信号捕捉
1、捕捉信号
(1)概念
如果信号的处理动作是用户自界说函数,在信号递达时就调用这个函数。
当我们的进程从内核态返回到用户态的时候,进行信号的检测和处理。
(2)过程示意图
2、signal函数
(1)函数
(2)描述
signal函数的举动在 UNIX 版本中各不相同,在不同版本的 Linux 中也存在差异。
signal函数将 signum 信号的处置(处理方法)设置为处理程序handler,该处理程序是SIG_IGN、SIG_DFL或自界说函数(handler)的地点。
如果 signum 信号被传送到进程,则会发生以下环境之一。如果处置(处理方法)设置为 SIG_IGN,则忽略该信号;如果处置设置为 SIG_DFL,则发生与该信号关联的默认利用;如果处置设置为自界说函数(handler),则首先将处置重置为 SIG_DFL,或者信号被阻止,然后使用参数 signum 调用处理程序(handler)。 如果调用处理程序导致信号被阻塞,则信号在从句柄(handler)返回时被排除阻塞。