Mac OS X:从Cocoa应用程序中杀死/退出整个流程树的最快方法

时间:2009-06-14 23:27:11

标签: cocoa macos macos-carbon kill

我知道有很多问题和答案,但我正在寻找一种高效而强大的解决方案。我需要在Cocoa应用程序中杀死进程及其所有子进程。我得到了进程ID,我要编写的代码是执行kill命令,如此

kill -- -<parent PID>

从我的应用程序中...但这对我来说似乎非常hacky和残酷。是不是有更好的解决方案?除非我自己构建流程树表示,否则Carbon的KillProcess()及其流程管理器朋友似乎没有多大帮助。我错过了什么吗?

我还有一些代码可以根据PID发送Quit Apple Event。能够将其发送到父进程定义的树中的每个进程,自下而上更好。但那只是一件好事。第一个问题的答案得到了“重点”。

2 个答案:

答案 0 :(得分:8)

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

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

/* ... */

killpg(getpgid(pid), SIGTERM);

当然应该进行适当的错误检查,但是你应该得到要点。有关详细信息,请参见手册页kill(2)killpg(2)

答案 1 :(得分:0)

我最后一次调查这个问题(几年前,但我认为没有太多改变)我发现的最佳解决方案就是调用system kill命令。

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