XCode优雅的程序关闭

时间:2014-01-24 17:58:16

标签: c++ c xcode

我正在使用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相反,此信号无法捕获或   忽略了,接收过程无法执行任何清理   收到此信号

1 个答案:

答案 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