Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ XCode程序关闭_C++_C_Xcode - Fatal编程技术网

C++ 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

我正在使用xcode开发一个类似服务器的程序,我希望它在调试运行之间能够正常关闭。基本上,下面的行不起作用

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
。我将更新我的答案以供将来参考。