我正在使用xcode中的类似服务器的程序,我希望它在调试运行之间正常关闭。基本上以下行不起作用
std::signal(SIGKILL, [](int){
printf("got sigkill here!\n");
//shut-down code here
});
我试过捕获其他信号,但到目前为止SIGINT,SIGTERM和SIGABRT都没有用。如果打印
,xcode如何终止程序程序以退出代码结束:9
到控制台?
修改 显然无法捕获SIGKILL,请参阅this wikipedia entry.
与SIGTERM和SIGINT相反,此信号无法捕获或 忽略了,接收过程无法执行任何清理 收到此信号
答案 0 :(得分:3)
你无法抓住SIGKILL
。当进程收到SIGKILL
时,它会立即终止。这用于杀死不响应或忽略常规SIGINT
的错误进程。如果你能抓住SIGKILL
,并可能忽略它,那么除了重新启动机器之外,没有办法杀死一个错误的过程。
另外,请注意您在信号处理程序中调用printf()
,这是不允许的。你不能指望它能发挥作用。
您可以在signal
联页中查看信号安全功能:http://man7.org/linux/man-pages/man7/signal.7.html - printf
不属于它,所以所有投注均已关闭。
从联系手册:
自处理以来,信号处理函数必须非常小心 其他地方可能会在执行中的某个任意点中断 该计划。 POSIX具有“安全功能”的概念。如果一个 信号中断执行不安全的函数和处理程序 调用一个不安全的函数,然后程序的行为是 未定义。
有关安全的替代方案,请参阅此问题:Print int from signal handler using write or async-safe functions