2015-11-07 42 views
0

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

另外,如果我在执行后按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); 
} 

回答

0

手册说:

的sigprocmask()执行功能检查和/或改变电流信号 掩模(这些信号 从输送被阻断这一点)。如果信号是当前的 信号掩码组的成员,则信号被阻止。

该面罩适用于整个过程,并用于屏蔽一些信号以便传送。这里没有继承。有一个掩码在每个执行点描述了一组阻塞的信号。

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

你的代码我的机器上执行得:

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 */ 
+0

捕手里面,我使用'sigprocmask(SIG_SETMASK,NULL,&set);'如果它不影响当前的信号掩码 – user3660655

+0

当然不是,NULL作为第二个参数意味着没有?新面具保持旧面貌。 –

+0

非常感谢....我在'sigprocmask()'中忘记了NULL参数的影响' – user3660655