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

我编写了一个守护进程,通常在得到一个信号后暂停并做一些事情(我使用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(); } } } 

据我testing,似乎有一些信号的堆栈,所以执行部分​​A中发生的信号使得守护程序从暂停()中唤醒,然后在刚完成部分A之后再次执行部分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(); } } } 

它似乎工作,因为我想要的。 有没有人认为这个代码有什么问题?

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