如何在处理信号时阻止相同的信号?

时间:2016-03-30 13:43:52

标签: c linux signals

我编写了一个守护程序,它通常会在获取信号后暂停并执行某些操作(我使用SIGHUP将其唤醒到另一个进程)。

这是我的代码。

...
static volatile sig_atomic_t saw_hup = 0;

static void sighup_handler(int s)
{
    saw_hup = 1;
}

int main(void)
{
    struct sigaction act_new;

    ...
    sigemptyset(&act_new.sa_mask);
    act_new.sa_handler = sighup_handler;
    sigaction(SIGHUP, &act_new, NULL);

    while(1) {
        saw_hup = 0;

        pause();
        if(saw_hup) {
            do_section_A();
        }
    }
}

就我测试而言,似乎信号有一些堆栈,因此执行A部分时发生的信号使得守护进程从暂停中唤醒()在完成部分之后再次执行A部分前一个。

但是,我想要阻止下一个SIGHUP信号,而不是再次执行A部分。我想要的是每当SIGHUP发生时执行A部分,除了在前一个SIGHUP信号执行的A部分中间。我该怎么做?

我认为在A部分A执行过程中发生SIGHUP执行A部分后,A部分再次被执行的问题。

这是我修改后的代码

...
static volatile sig_atomic_t saw_hup = 0;

static void sighup_handler(int s)
{
    saw_hup = 1;
}

int main(void)
{
    struct sigaction act_new;

    ...
    sigemptyset(&act_new.sa_mask);
    act_new.sa_handler = sighup_handler;
    sigaction(SIGHUP, &act_new, NULL);

    while(1) {
        saw_hup = 0;

        pause();
        if(saw_hup) {
            do_section_A();
        }
    }
}

它似乎按我的意愿工作。有人认为这段代码有问题吗?

1 个答案:

答案 0 :(得分:1)

pthread_sigmask()可用于屏蔽线程中的信号。 sigprocmask()可用于屏蔽单线程应用程序中的信号。