2013-05-08 46 views
0

我试图结合信号和报警。 我有2个进程。 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 
... 
} 

回答

0

Eevery时候你会得到一个SIGUSR2(或任何类型的信号),你重复while循环,并且t帽子将您的闹钟定时器重置为1秒。这意味着如果SIGUSR2信号每秒超过一次,您的闹钟不会消失。

试着做以下修改:

  • 移动两个signal()配置外循环的报警处理。每次循环都不需要重置信号处理程序。一旦它们被设置,它们就会被设置。
  • 在未收到SIGALRM之后,请勿在循环中调用alarm(1)。 取而代之,请在启动循环之前调用alarm(1)一次,然后再次从alarm_hand函数中重置计时器。
+0

首先,它不返回到循环,因为如果 只有1个SIGUSR2信号到达它不会激活警报。我等了10秒,它什么也没做。 我没有把信号处理程序移到循环之外,谢谢。 但是,如果我将警报(1)移到循环外并在警报处理程序功能中再次调用它,它只会执行一次警报功能。除此之外,循环除了闹钟(1)和暂停()之外什么也不做,所以如果我把它们移到循环外面,我可以完全清理循环。 – 2013-05-08 16:49:33

+0

它肯定应该返回到循环。信号到达后,'pause()'返回。为什么不添加一些调试'printf()'到循环中以说服哪些代码行正在执行? – Celada 2013-05-08 16:53:53

+0

好吧,它的工作原理,我只需要在报警处理程序函数内部清除报警处理函数。非常感谢你! – 2013-05-08 17:15:48