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