繁体   English   中英

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

[英]Mac OS X: Getting detailed process information (specifically its launch arguments) for arbitrary running applications using its PID

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

目前我正在使用NSWorkspace ,注册“did launch application”通知。 我还使用runningApplications方法来获取我的应用程序启动时当前正在运行的应用程序。

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

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

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

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

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

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

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

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

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

你可以使用ps使用的任何东西,虽然它不是基于可可的。 根据Singh的说法, ps基于kvm和sysctl调用。 倾向于 ,相关的调用似乎是kvm_openfileskvm_getprocskvm_getargv 要获取命令行参数,首先调用kvm_openfiles以访问内核内存空间,然后使用kvm_getprocs获取内核进程信息,然后使用kvm_getargv

ps使用sysctl似乎与你的目标不太相关; 它用于获取其他信息,例如组ID和父进程ID。 所使用的特定的sysctl名称是{CTL_KERN, KERN_PROC, KERN_PROC_ which , flags } ,其中指定一个处理过滤器(例如ALLPID )和标志对过滤器参数(细节在sysctl手册页)。

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

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

不 - 运行ps是你最好的选择。 OS X不支持标准进程信息接口(OS X 10.4中提供了noop版本,但之后已删除),私有接口可能会在OS X版本之间发生变化。

如果您愿意将自己锁定到单个OS X版本中,则所有源都可用,例如pslibproc ; 你还需要以root身份运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM