【问题标题】:how to block same signal while processing a signal?如何在处理信号时阻止相同的信号?
【发布时间】:2016-03-30 13:43:51
【问题描述】:

我编写了一个守护进程,它通常会在收到信号后暂停并执行某些操作(我使用 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 中出现的信号使守护进程从 pause() 中唤醒,在完成部分后立即再次执行部分 A前一个。

但是,我希望下一个 SIGHUP 信号被阻塞,而不是被它再次执行 A 部分。我想要的是在 SIGHUP 发生时执行 A 部分,除了在前一个 SIGHUP 信号执行的 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();
        }
    }
}

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

【问题讨论】:

  • 为什么不将 A 部分移至信号处理程序?
  • 我试图将 A 部分移至信号处理程序。但是,如果在处理程序执行过程中出现新的 SIGHUP 信号,它会在完成前一个信号的处理程序函数后再次执行信号处理程序。我想要的是下一个信号不要唤醒 pause()。

标签: c linux signals


【解决方案1】:

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

【讨论】:

  • 谢谢你回答我的问题,gzh。我尝试在 pause() 之后和 A 部分的末尾使用 sigprocmask()。但是,在完成 A 部分后,A 部分由在前一个信号执行过程中发生的信号再次执行。所以,我想要的是下一个信号不要唤醒 pause()。
  • @SB.Son,您应该重新考虑您的处理流程,而不仅仅是如何阻止信号。请参考pilcrow提供的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
相关资源
最近更新 更多