Objective c 观察未知PID的过程(无UI)

Objective c 观察未知PID的过程(无UI),objective-c,c,cocoa,macos-carbon,Objective C,C,Cocoa,Macos Carbon,我发现了一个问题,但即使当它接近我需要的时候,它也是无用的 基本上,当另一个进程(已知名称)启动和/或终止时,我有一个应用程序需要做一些事情,但我没有PID,所以我无法设置一个kqueue来查找它 我可以为“ps aux | grep processtolook | grep-v grep”命令做一段时间,但这是我最后的选择 有什么想法吗?如果您想要PID的目标进程/程序名是“processtolook”,那么您可以使用pidof命令来获取正在运行的程序的PID pidof processtol

我发现了一个问题,但即使当它接近我需要的时候,它也是无用的

基本上,当另一个进程(已知名称)启动和/或终止时,我有一个应用程序需要做一些事情,但我没有PID,所以我无法设置一个kqueue来查找它

我可以为“ps aux | grep processtolook | grep-v grep”命令做一段时间,但这是我最后的选择


有什么想法吗?

如果您想要PID的目标进程/程序名是“processtolook”,那么您可以使用
pidof
命令来获取正在运行的程序的PID

pidof processtolook

请参阅
pidof
手册。这是sysvinit工具包的一部分

EDIT1: 看看我发现的代码:


这可能会帮助您获得大纲。

在BSD上,您可以使用kvm_openfiles和kvm_getprocs实现您想要的功能。我不知道OSX上是否有。如果你有一个pgrep程序,看看它是如何实现的(src/bin/pkill.c)。

看看这个答案:。libproc.h头文件具有
proc_listpid
,它将获得所有的PID。然后可以在循环中获取pid信息,并使用
proc_pidinfo
检查名称。根据建议查看顶级来源也可能是值得的。(当前版本在此。)

不幸的是,这是一个未记录的接口,随时可能更改。而且,这不是最快的事情,因为您必须循环系统中的所有进程。一般来说,这不是一个很好的方法


更好的方法可能是编写一个新的processtolook,它只调用旧的processtolook,您可以移动或重命名它。然后,它可以通知您流程的启动和停止。这是可能的吗?

你知道你想要pid的进程/程序的名称吗?看看我的答案,如果它对你有帮助的话。一般进程还是应用程序?如果一个应用程序,请参见nsrunningapplication,它在概念上与使用“ps aux | grep processtolook | grep-v grep”相同,并且我需要在运行时了解它,因此需要一段时间的“pidof processtolook”,这是我想要避免的。此外,不是Mac OSX的一部分。请看一下EDIT1,我已经提供了一个我找到的链接。最后一段为+1。这是真正的解决方案:用通知程序的包装器替换要观看的程序。不,这是不可能的,因为这是一个系统调用的进程(当遇到击键时由OSX调用),我不应该弄乱用户的系统配置,对吗?无论如何,我选择你的答案,因为这就是我在没有问的情况下所做的:)