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]和解析输出的路线......我更喜欢更高级别的东西.
你可以使用任何ps用途,虽然它不是基于可可的.据Singh称,ps基于kvm和sysctl调用.倾注于源头,相关的呼叫似乎是kvm_openfiles,kvm_getprocs和kvm_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"在没有轮询的情况下观察过程生命周期"也可能对您有用.
| 归档时间: |
|
| 查看次数: |
9803 次 |
| 最近记录: |