为什么信号不会被抓住?

Sha*_*off 4 unix macos posix signals objective-c

在我的main()的最开始,我有:

signal(SIGTERM, SIGTERM_handler);
Run Code Online (Sandbox Code Playgroud)

SIGTERM_handler是:

void SIGTERM_handler(int signum) {

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

这些线从未打印过.当我在处理程序中设置断点时,它们永远不会被击中.我不打电话到sigaction()任何地方.GDB设置为通过我关心的信号(handle SIGTERM SIGINT pass stop print或者handle SIGTERM SIGINT pass nostop print).甚至默认的信号处理程序也不起作用 - 向程序发送SIGINT(我没有指定处理程序)也没有做任何事情.

可能是什么导致了这个?

wbe*_*rry 5

我不知道Objective C,但我确实有信号处理程序的经验,所以我会回答好像对于POSIX和C.

在信号处理程序中调用未记录为"异步信号安全"的任何功能都是一种风险,应该避免.调用信号处理程序时,不能对堆栈或任何其他状态做任何假设.当调用信号处理程序时,堆栈甚至可能被"删除"(在创建或破坏帧的过程中).调用信号处理程序时,库可能具有不一致的状态.

声明在事件循环中检查的volatile标志(int),或者其他任何东西,以查看它是否已更改.信号处理程序应该只设置该标志并返回,没有别的.(除非您的平台执行SVR4样式的信号,在这种情况下,您还需要在信号处理程序中重新安装信号处理程序.)

响应信号的日志消息和其他活动应该通过任何代码检查标志并处理标志所隐含的事件来完成.

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