C 报警停止';信号何时到达

C 报警停止';信号何时到达,c,unix,signals,alarm,C,Unix,Signals,Alarm,我试着把信号和警报结合起来。 我有两个过程。1接收来自用户的输入,并将其写入管道,然后向另一个进程发送信号(SIGUSR2)。 在另一个过程中,我有一个无限循环,它每秒产生警报。 所以我的程序应该同时处理报警信号和SIGUSR2信号。 报警句柄工作正常,但当信号到达且信号句柄处于活动状态时,它似乎不会返回到产生报警的循环。 我读了报警和信号的手册页,没有找到任何东西。它说信号处理函数应该返回到原始代码,但它没有。 我想知道为什么代码不在信号处理程序之后返回到循环,以及如何强制它每秒执行报警处理程

我试着把信号和警报结合起来。 我有两个过程。1接收来自用户的输入,并将其写入管道,然后向另一个进程发送信号(SIGUSR2)。 在另一个过程中,我有一个无限循环,它每秒产生警报。 所以我的程序应该同时处理报警信号和SIGUSR2信号。 报警句柄工作正常,但当信号到达且信号句柄处于活动状态时,它似乎不会返回到产生报警的循环。 我读了报警和信号的手册页,没有找到任何东西。它说信号处理函数应该返回到原始代码,但它没有。 我想知道为什么代码不在信号处理程序之后返回到循环,以及如何强制它每秒执行报警处理程序功能,即使同时接收到信号

这是一个循环:

while (1) {
signal (SIGUSR2 , signal_hand);
signal (SIGALRM , alarm_hand);
alarm (1);
pause();
}
这是信号处理函数:

void signal_hand (int sig) {
// reading from the pipe and doing things accordingly
...
}
void alarm_hand (int sig) {
// doing things
...
}
这是报警处理程序的功能:

void signal_hand (int sig) {
// reading from the pipe and doing things accordingly
...
}
void alarm_hand (int sig) {
// doing things
...
}

每次收到
SIGUSR2
(或任何类型的信号)时,重复
while
循环,将报警计时器重置为1秒。这意味着,如果
SIGUSR2
信号每秒出现一次以上,则您的警报永远不会熄灭

尝试进行以下更改:

  • 移动两个
    信号()。无需每次通过循环时都重置信号处理程序。一旦设置好,它们就设置好了
  • 在可能未收到
    SIGALRM
    信号后,不要在循环中调用
    报警(1)
    。 相反,在启动循环之前,请调用
    报警(1)
    一次,然后再次从
    报警手
    功能内部重置计时器

首先,它不会返回回路,因为如果只有1个SIGUSR2信号到达,它也不会激活报警。我等了10秒钟,它什么也没做。我确实把信号处理器移到了环路外,谢谢。但是,如果我将报警(1)移到循环外,并在报警处理程序函数内再次调用它,它只执行了一次报警功能。此外,循环只执行报警(1)和暂停(),因此,如果我将它们移到循环之外,我可以完全取消循环。它肯定会返回到循环<代码>暂停()在信号到达后返回。为什么不在循环中添加一些调试
printf()
s,让自己确信哪些代码行是在何时执行的呢?好吧,它起作用了,我只需要在alarm handler函数中清除alarm handler函数。非常感谢你!