void main ()
{
int c;
signal (SIGINT, Handle);
while (( c = getchar()) != '\n' );
return();
}
void Handle(signum)
{
signal {SIGINT, Handle);
printf ("beep \n");
}
我认为它会打印'beep',直到按下任何键但方法调用在循环之外? :S
答案 0 :(得分:4)
您将Handle()注册为SIGINT的处理程序。当用户试图中断程序时发送信号SIGINT,因此如果你启动这个程序,如果你按下control-c它应该打印蜂鸣声。
查看有关SIGINT, about the signal() function和about using it 的文档。
如Tim所述,请使用sigaction()代替signal()。
答案 1 :(得分:0)
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。