C++ XCode程序关闭
我正在使用xcode开发一个类似服务器的程序,我希望它在调试运行之间能够正常关闭。基本上,下面的行不起作用C++ XCode程序关闭,c++,c,xcode,C++,C,Xcode,我正在使用xcode开发一个类似服务器的程序,我希望它在调试运行之间能够正常关闭。基本上,下面的行不起作用 std::signal(SIGKILL, [](int){ printf("got sigkill here!\n"); //shut-down code here }); 我尝试捕获其他信号,但到目前为止,SIGINT、SIGTERM和SIGABRT都不起作用。如果打印,xcode如何终止程序 程序以退出代码9结束 到控制台 编辑 显然西格基尔是抓不到的,明白吗 与S
std::signal(SIGKILL, [](int){
printf("got sigkill here!\n");
//shut-down code here
});
我尝试捕获其他信号,但到目前为止,SIGINT、SIGTERM和SIGABRT都不起作用。如果打印,xcode如何终止程序
程序以退出代码9结束
到控制台
编辑
显然西格基尔是抓不到的,明白吗
与SIGTERM和SIGINT相反,此信号无法捕获或删除
忽略,并且接收进程无法对
收到这个信号
您无法捕获
SIGKILL
。当进程收到SIGKILL
时,它立即终止。这用于杀死那些不会响应或忽略常规的SIGINT
的错误进程。如果您可以捕获SIGKILL,并可能忽略它,那么除了重新启动机器之外,就没有办法杀死有缺陷的进程
另外,请注意,您正在信号处理程序中调用printf()
,这是不允许的。你不能指望这会奏效
您可以在signal
manpage中查看信号安全功能:-printf
不是它的一部分,因此所有赌注都是无效的
从手册页:
信号处理函数必须非常小心,因为
在执行过程中的某个任意点,其他位置可能会被中断
是节目的一部分。POSIX具有“安全功能”的概念。如果
信号中断不安全函数的执行,处理程序
调用不安全的函数,则程序的行为
未定义
有关安全的替代方案,请参见此问题:您所说的不工作是什么意思?在我得到“程序以退出代码9结束”之前,我不会在控制台上打印“get sigkill here”。我是在终端上做的,它在control+c上发送SIGINT,所以我假设我也应该在xcode控制台中得到一些输出。嗯,我明白了。嗯,我仔细阅读了手册页链接,上面说打开/关闭是安全的。将printf替换为close(open(“test”,O|u WRONLY | O|u CREAT));如果我按下xcode中的停止按钮,则不会创建文件,尽管它们应该可以安全地调用。我猜也许xcode没有发出sigkill的信号……显然你抓不到sigkill。来自维基百科:“与SIGTERM和SIGINT相比,此信号不能被捕获或忽略,接收过程在接收到此信号后无法执行任何清理”@Gleno Ha!当然我不记得了。您无法捕获
SIGKILL
;这是发送给强制进程关闭的信号(在Linux中,使用kill-9
。我将更新我的答案以供将来参考。