我试图检测特定应用程序何时启动。
目前我正在使用NSWorkspace
,注册“确实启动应用程序”通知。我还使用runningApplications
方法来获取我的应用程序启动时当前正在运行的应用程序。
对于大多数应用程序,应用程序包的名称就足够了。我有一个“已知应用程序”的plist,我用通知中传递的名称交叉检查。
这可以正常工作,直到您遇到一个应用程序作为代理,使用命令行参数启动另一个应用程序。
示例:Mac上新发布的Portal没有专用的应用程序包。 Steam可以创建一个快捷方式,只需用hl2_osx
参数和-game
作为参数启动portal
应用程序。
由于更多基于源的游戏正在向Mac发展,我想他们将使用相同的方法来启动,有效地使用hl2_osx
参数运行-game
应用程序。
有没有一种很好的方法来使用Cocoa API获取参数列表(及其参数)?
NSProcessInfo
接近,提供了一个`-arguments'方法,但只为自己的进程提供信息......
NSRunningApplication
提供了使用PID获取任意应用程序信息的能力,但没有命令行参数...
有没有什么能填补两者之间的空白?
我试图不沿着产生NSTask
的路线去运行ps -p [pid]
并解析输出......我更喜欢更高级别的东西。
你可以使用任何ps
使用的,虽然它不是基于可可。根据Singh,ps
基于kvm和sysctl调用。倾向于source,相关的呼叫似乎是kvm_openfiles
,kvm_getprocs
和kvm_getargv
。要获取命令行参数,首先调用kvm_openfiles
以访问内核内存空间,然后使用kvm_getprocs
获取内核进程信息,然后使用kvm_getargv
。
在sysctl
中使用ps
似乎与你的目标不太相关;它用于获取其他信息,例如组ID和父进程ID。使用的特定sysctl名称是{CTL_KERN, KERN_PROC, KERN_PROC_which, flags}
,其中指定了进程过滤器(例如ALL
,PID
),flags是过滤器的参数(详细信息在sysctl
手册页中)。
OS X没有支持procfs,但Singh开发了一个在GPLv2下发布的FUSE based version。如果将它与应用程序捆绑在一起,则必须在GPLv2下发布它。大多数MacFUSE都是在BSD-style license下发布的,所以它可以与您的应用程序一起发布而不需要开源(fusefs / fuse_nodehash.c是在Apple的开源许可下发布的,但它也允许链接到封闭源应用程序)。
应该使用“Get other process' argv in OS X using C”这个问题,因为它有使用kvm和sysctl的示例代码。 TN 2050 "Observing Process Lifetimes Without Polling"也可能对你有用。