MacOSX:从Cocoa应用程序中终止/退出整个进程树的最快方法

MacOSX:从Cocoa应用程序中终止/退出整个进程树的最快方法,cocoa,macos,macos-carbon,kill,Cocoa,Macos,Macos Carbon,Kill,我知道关于这一点有很多问题和答案,但我正在寻找一个高效、稳健的解决方案。我需要从Cocoa应用程序中杀死一个进程及其所有子进程。我得到了进程ID,我要编写的代码是执行kill命令,如下所示 kill -- -<parent PID> kill--- 从我的应用程序中。。。但对我来说,这似乎是非常刻薄和残忍的。难道没有更好的解决办法吗?Carbon的KillProcess()及其Process Manager朋友似乎帮不了什么忙,除非我自己构建一个流程树表示。我错过什么了吗 我还有

我知道关于这一点有很多问题和答案,但我正在寻找一个高效、稳健的解决方案。我需要从Cocoa应用程序中杀死一个进程及其所有子进程。我得到了进程ID,我要编写的代码是执行kill命令,如下所示

kill -- -<parent PID>
kill---
从我的应用程序中。。。但对我来说,这似乎是非常刻薄和残忍的。难道没有更好的解决办法吗?Carbon的KillProcess()及其Process Manager朋友似乎帮不了什么忙,除非我自己构建一个流程树表示。我错过什么了吗


我还有一些基于PID发送退出苹果事件的代码。如果能够自下而上将其发送到父进程定义的树中的每个进程,那就更好了。但这只是一个很好的选择。第一个问题的答案就是“要点”。

您可以使用killpg来终止流程及其组中的所有内容:

#include <signal.h>
#include <unistd.h>

/* ... */

killpg(getpgid(pid), SIGTERM);
#包括
#包括
/* ... */
killpg(getpgid(pid),SIGTERM);

当然,应该进行适当的错误检查,但您应该了解要点。有关更多信息,请参阅手册页
kill(2)
killpg(2)

上次我研究这个问题时(几年前,但我认为没有太大变化),我找到的最佳解决方案就是调用系统kill命令

system( "ps axwww | grep -i CoreServices/Dock.app/Contents/MacOS/Dock | grep -v grep | awk '{print $1}' | xargs kill -3" );

谢谢你的快速回复,效果很好。小添加:获取给定ID的进程组ID的正确函数是getpgid,而不是getpgrp。哦,你说得对!很抱歉,getpgrp()返回调用方的进程组:)由于某些原因,您可以始终使用killpg(2),但这不会杀死子进程,也不会杀死孙子进程等,而只能杀死父进程。