【发布时间】: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()。