【问题标题】:XCode graceful program shutdownXCode 优雅的程序关闭
【发布时间】:2014-01-24 17:58:15
【问题描述】:

我正在 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 相比,此信号无法被捕获或 被忽略,并且接收进程无法执行任何清理 接收到这个信号

【问题讨论】:

  • 不工作是什么意思?
  • 在我得到“程序以退出代码结束:9”之前,我没有在控制台上打印出“这里有 sigkill”。我在终端中执行,它在 control+c 上发送 SIGINT,所以我认为我也应该在 xcode 控制台中获得一些输出。

标签: c++ c xcode


【解决方案1】:

你抓不到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

【讨论】:

  • 嗯,我明白了。好吧,我仔细阅读了联机帮助页链接,它说打开/关闭是可以安全调用的。用 close(open ("test", O_WRONLY | O_CREAT)); 替换我的 printf如果我在 xcode 中按下停止按钮,则不会创建文件,尽管它们应该可以安全调用。我猜也许 xcode 没有发出 sigkill 信号。。
  • 显然你无法捕捉到 sigkill。来自维基百科:“与 SIGTERM 和 SIGINT 相比,此信号不能被捕获或忽略,并且接收进程在收到此信号后无法执行任何清理”
  • @Gleno 哈!当然!我不记得那件事了。你抓不到SIGKILL;这是发送以强制进程关闭的信号(在 Linux 中,使用 kill -9 <pid>。我将更新我的答案以供将来参考。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-23
  • 2016-09-21
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 2012-08-22
相关资源
最近更新 更多