2011-07-12 80 views
4

在我的main()的开始,我有:为什么信号不会被捕获?

signal(SIGTERM, SIGTERM_handler); 

SIGTERM_handler是:

void SIGTERM_handler(int signum) { 

    NSLog(@"Caught signal: [%d]. Cleaning up ...",signum); 
    //cleanup(); 
    NSLog(@"Done cleaning up. Exiting ..."); 
    exit(EXIT_FAILURE); 
} 

那些线从来没有印刷。当我在处理程序中设置断点时,它们从不被击中。我不会在任何地方拨打sigaction()。 GDB设置为通过我关心的信号(handle SIGTERM SIGINT pass stop printhandle SIGTERM SIGINT pass nostop print)。即使是默认的信号处理程序也不起作用 - 向程序发送SIGINT(为此我没有指定处理程序)也什么都不做。

这可能是什么原因造成的?

+0

有没有可能日志文件缓冲区没有被刷新? –

+0

如何在gdb中运行时将信号发送给您的进程?我会建议尝试其他信号之一(比如杀死-1或杀死-2) – KevinDTimm

+0

我发送的信号包括'kill -2','kill -15'和其他信号。我知道这是行得通的,因为如果我转而做“处理...停止”,那么GDB确实停止并说我的程序收到了一个信号;它仍然不会触发处理程序。 –

回答

2

肖恩,所以你使用CZMQ,每当你做一个zctx_new()时,它将信号转移到自己的目的。我的建议是,如果可能让CZMQ做它的事情,并使用它提供的机制来捕获中断,这些机制是全局zctx_interrupted变量,并且在任何阻塞的ZMQ调用中,都会返回一个空返回值和EINTR错误代码。

5

我不知道目标C,但我确实有信号处理经验,所以我会回答,因为如果POSIX和C.

调用没有被记录为“异步信号安全”中的任何功能信号处理程序是一种风险,应该避免。当调用信号处理程序时,您不能对堆栈或其他状态做出任何假设。当您的信号处理程序被调用时,堆栈甚至可能会被“丢弃”(在创建或销毁帧的过程中)。当您的信号处理程序被调用时,您的库可能有不一致的状态。

声明一个在你的事件循环中被检查的易失标志(int),以查看它是否已经改变。信号处理程序应该只设置该标志并返回,没有别的。 (除非您的平台使用SVR4类型的信号,在这种情况下,您还需要在信号处理程序中重新安装信号处理程序。)

响应信号的日志消息和其他活动应该通过任何代码完成检查标志并处理该标志暗示的事件。

您看到的症状可能不是由于信号处理程序中的库调用(我的钱会诚实地在gdb交互中),但我绝对建议将所有库调用从信号处理程序中取出。

0

你在调试器中运行这个吗?从GDB发布的内部和外部,我遇到了在iOS平台上处理信号的问题。我认为OSX中会出现同样的问题。这已经很长时间了,我不能给你具体的东西

相关问题