我编写了一个守护程序,它通常会在获取信号后暂停并执行某些操作(我使用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();
}
}
}
它似乎按我的意愿工作。有人认为这段代码有问题吗?
答案 0 :(得分:1)
pthread_sigmask()可用于屏蔽线程中的信号。 sigprocmask()可用于屏蔽单线程应用程序中的信号。