我正在使用xcode开发类似于服务器的程序,并且希望它在调试运行之间正常关闭。基本上下面的行不起作用
std::signal(SIGKILL, [](int){
printf("got sigkill here!\n");
//shut-down code here
});
我曾尝试捕获其他信号,但到目前为止,SIGINT,SIGTERM和SIGABRT均无效。xcode如何终止程序(如果打印)
程序以退出代码结束:9
到控制台?
编辑显然无法捕获SIGKILL,请参阅此Wikipedia条目。
与SIGTERM和SIGINT相比,此信号无法捕获或忽略,并且接收过程在接收到此信号后无法执行任何清理
你抓不到SIGKILL
。当进程收到时SIGKILL
,它立即终止。这用于杀死不会响应或忽略常规的bug进程SIGINT
。如果您可以捕获SIGKILL
并可能忽略它,那么除了重新启动计算机之外,没有其他方法可以杀死有问题的进程。
另外,请注意,您正在调用printf()
信号处理程序,这是不允许的。您不能指望它能起作用。
你可以看看在信号的安全保护功能signal
手册页:http://man7.org/linux/man-pages/man7/signal.7.html -printf
是不是它的一部分,因此,所有的赌注都关闭。
从联机帮助页:
信号处理程序的功能必须非常小心,因为在程序执行的任意位置可能会中断其他地方的处理。POSIX具有“安全功能”的概念。如果信号中断了不安全功能的执行,并且处理程序调用了不安全功能,则程序的行为是不确定的。
有关安全替代方案,请参见此问题:使用写入或异步安全函数从信号处理程序中打印int
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句