Mac OS X:使用PID获取任意运行应用程序的详细过程信息(特别是其启动参数)

Jas*_*ien 7 cocoa pid process objective-c command-line-arguments

我试图检测特定应用程序何时启动.

目前我正在使用NSWorkspace,注册"确实启动应用程序"通知.我还使用该runningApplications方法来获取应用启动时当前正在运行的应用.

对于大多数应用程序,应用程序包的名称就足够了.我有一个"已知应用程序"的plist,我用通知中传递的名称交叉检查.

这可以正常工作,直到您遇到一个应用程序作为代理,使用命令行参数启动另一个应用程序.

示例:Mac上新发布的Portal没有专用的应用程序包.Steam可以创建一个快捷方式,只需hl2_osx使用-game参数和portal参数启动应用程序即可.

由于更多基于源的游戏正在前往Mac,我想他们将使用相同的方法启动,有效地运行hl2_osx带有-game参数的应用程序.

有没有一种很好的方法来使用Cocoa API获取参数列表(及其参数)?

NSProcessInfo 接近,提供`-arguments'方法,但只为自己的进程提供信息......

NSRunningApplication 提供了使用PID获取任意应用程序信息的能力,但没有命令行参数...

有没有什么能填补两者之间的空白?

我试图不去产生NSTask运行ps -p [pid]和解析输出的路线......我更喜欢更高级别的东西.

out*_*tis 8

你可以使用任何ps用途,虽然它不是基于可可的.据Singh称,ps基于kvm和sysctl调用.倾注于源头,相关的呼叫似乎是kvm_openfiles,kvm_getprocskvm_getargv.要获取命令行参数,首先调用kvm_openfiles以获取对内核内存空间的访问权限,然后使用kvm_getprocs获取内核进程信息kvm_getargv.

使用sysctlin ps似乎与你的目标不太相关; 它用于获取其他信息,例如组ID和父进程ID.具体使用的sysctl的名字,在指定的过程滤波器(例如,)和标志是过滤器参数(细节都在手册页).{CTL_KERN, KERN_PROC, KERN_PROC_which, flags}ALLPIDsysctl

OS X没有支持procfs,但Singh开发了一个基于FUSE的版本,在GPLv2下发布.如果将它与应用程序捆绑在一起,则必须在GPLv2下发布它.大多数MacFUSE都是在BSD风格的许可下发布的,所以它可以随你的应用程序一起发布而不需要开源(fusefs/fuse_nodehash.c是在Apple的开源许可下发布的,但它也允许链接到封闭的源应用程序).

应该使用 " 在OS X中使用C获取其他进程'argv "这个问题,因为它有使用kvm和sysctl的示例代码.TN 2050"在没有轮询的情况下观察过程生命周期"也可能对您有用.

  • `kvm_`函数是我在答案中提到的"noop版本".它们不起作用.(`sysctl`确实如此,但它不是一个公共接口.)`kvm_`手册页和`kvm.h`存在于10.4(当你链接到)但是在10.5+中消失了.请注意,`ps`源中对`kvm`的所有​​引用都由`#ifndef __APPLE__`或`#if FIXME`保护 - 我的猜测是开发人员计划在将来实现`kvm_*`但是没有时间(也许永远不会). (2认同)