通过signal()帮助实现信号处理程序

时间:2010-04-19 11:48:59

标签: c posix

void main ()
{
  int c;

  signal (SIGINT, Handle);
  while (( c = getchar()) != '\n' );

  return();
}

void Handle(signum) 
{
   signal {SIGINT, Handle); 
   printf ("beep \n");
}

我认为它会打印'beep',直到按下任何键但方法调用在循环之外? :S

3 个答案:

答案 0 :(得分:4)

您将Handle()注册为SIGINT的处理程序。当用户试图中断程序时发送信号SIGINT,因此如果你启动这个程序,如果你按下control-c它应该打印蜂鸣声。

查看有关SIGINT about the signal() functionabout using it 的文档。

如Tim所述,请使用sigaction()代替signal()。

答案 1 :(得分:0)

仅当INT信号传递给代码时才会调用

Handle(最有可能是当您按 CTRL C CTRL BREAK 虽然还有其他方法可以提升该信号),等待按键时

你也会发现这些行

signal {SIGINT, Handle);

return();

是拼写错误 - 第一个大括号应该是一个括号,你应该使用return 0;作为第二个。此外,如果您希望符合标准,main应返回一个整数。

答案 2 :(得分:0)

除了使用sigaction ......

请将回调更改为NOT call printf。 Printf调用系统调用write()并写入标准输出缓冲区,与main调用混合。在信号处理程序中应避免系统调用和修改stdout。

相反,在信号处理程序中设置一个sig_atomic_t标志变量,然后检查并取消设置它并在主循环中执行printf。