使用sigprocmask()的sigset_t unix

时间:2015-11-07 06:25:49

标签: unix signals sigint sigprocmask

我正在尝试使用printf打印sigset。在这个程序中,我使用了sigprocmask来阻止SIGHUP和SIGTERM。将set和oset初始化为空集后,它们会给出一些随机的十六进制字符串作为输出。我该如何解决这个问题??

另外,如果我在执行后按下Ctrl-C,我对该程序的预期输出有疑问。捕手功能是否也继承了当前的信号集,并且应该按照设置打印?

#include<stdio.h>
#include<unistd.h>
#include<signal.h>
#include<bits/sigset.h>
void catcher(int sig){
        sigset_t set;
        sigprocmask(SIG_SETMASK, NULL, &set);
        printf("%x inside function\n",set);
}
int main()
{
        sigset_t set,oset;
        signal(SIGINT,catcher);
        sigemptyset(&set);
        sigemptyset(&oset);
        printf("%x\n",oset);
        printf("%x\n",set);
        sigaddset(&set,SIGHUP);
        sigaddset(&set,SIGTERM);
        sigprocmask(SIG_SETMASK,NULL,&oset);
        printf("%x\n",oset);
        printf("%x\n",set); 
        sigprocmask(SIG_BLOCK,&set,&oset);
        pause();
        sigprocmask(SIG_SETMASK,&oset,&set);
        printf("%x\n",set);
}

1 个答案:

答案 0 :(得分:0)

手册说:

  

sigprocmask()函数检查和/或更改当前信号   掩码(那些信号        被阻止交付)。如果信号是当前的成员,则会阻止信号        信号掩码集。

此掩码用于整个过程,用于阻止某些信号传递。这里没有 inheritence 。有一个掩码在每个执行点描述阻塞信号的集合。

你应该知道的是,默认情况下,当捕获信号时,它会自动添加到阻塞信号集中(以防止重新进入捕获程序),并在结束时删除。

在我的机器上执行代码会产生:

0            // empty set
0            // empty oset
0            // empty oset
4001         // set = { HUP, TERM }
^C4003       // in catcher, signal is automatically blocked set={HUP, INT, TERM}
4001         // after catcher back in old state set={HUP,TERM}

这意味着第0位和第14位用于SIGHUPSIGTERM,第1位用于SIGINT,这正是我在系统头文件中找到的:

#define SIGHUP  1       /* hangup */
#define SIGINT  2       /* interrupt */
#define SIGTERM 15      /* software termination signal from kill */