我正在尝试使用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);
}
答案 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位用于SIGHUP
和SIGTERM
,第1位用于SIGINT
,这正是我在系统头文件中找到的:
#define SIGHUP 1 /* hangup */
#define SIGINT 2 /* interrupt */
#define SIGTERM 15 /* software termination signal from kill */