【问题标题】:sigset_t unix using sigprocmask()sigset_t unix 使用 sigprocmask()
【发布时间】:2016-02-08 08:54:23
【问题描述】:

我正在尝试使用 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);
}

【问题讨论】:

    标签: unix signals sigint sigprocmask


    【解决方案1】:

    手册说:

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

    这个掩码是针对整个过程的,用来屏蔽一些信号的传递。这里没有继承。有一个掩码在每个执行点描述 blocked 信号集。

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

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

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

    【讨论】:

    • 在捕手内部,我使用的是sigprocmask(SIG_SETMASK, NULL, &amp;set);。不应该影响当前的信号掩码吗?
    • 当然不是,NULL 作为第二个参数意味着没有新掩码保留旧掩码。
    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 2011-02-24
    • 2010-09-06
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多