1

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

另外,如果我在执行后按 Ctrl-C,我对该程序的预期输出有疑问。catcher 函数是否也继承了当前的信号集并且应该与 set 一样打印?

#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);
}
4

1 回答 1

1

手册说:

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 用于SIGHUPand SIGTERM,位 1 用于SIGINT,这正是我在系统头文件中找到的:

#define SIGHUP  1       /* hangup */
#define SIGINT  2       /* interrupt */
#define SIGTERM 15      /* software termination signal from kill */
于 2015-11-07T08:42:06.873 回答