Objective c MacOSX:使用PID获取任意运行应用程序的详细进程信息(特别是其启动参数)

Objective c MacOSX:使用PID获取任意运行应用程序的详细进程信息(特别是其启动参数),objective-c,cocoa,process,command-line-arguments,pid,Objective C,Cocoa,Process,Command Line Arguments,Pid,我试图检测特定应用程序何时启动 目前我正在使用NSWorkspace,注册“did launch application”通知。我还使用runningApplications方法获取应用程序启动时当前正在运行的应用程序 对于大多数应用程序,应用程序包的名称就足够了。我有一个“已知应用程序”列表,我与通知中传递的应用程序名称进行了交叉检查 这可以正常工作,直到您遇到一个应用程序,该应用程序充当使用命令行参数启动另一个应用程序的代理 示例:Mac上新发布的门户没有专用的应用程序包。Steam可以创建

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

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

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

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

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

由于越来越多的基于源代码的游戏将进入Mac,我想他们将使用相同的方法启动,有效地运行带有
-game
参数的
hl2_osx
应用程序

有并没有一种很好的方法可以使用CocoaAPI获取参数(及其参数)列表

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

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

有什么东西可以填补两者之间的差距吗


我试图避免产生一个
NSTask
来运行
ps-p[pid]
并解析输出。。。我更喜欢更高级的东西。

不-跑步
ps
是你最好的选择。OSX上不支持标准的进程信息接口(OSX10.4中提供了noop版本,但随后被删除),并且在OSX版本之间可能会更改专用接口


如果你想把自己锁定在一个单一的OSX版本中,那么所有的源代码都是可用的,例如或;您还需要以root身份运行。

您可以使用
ps
使用的任何东西,尽管它不是基于cocoa的。根据ps是基于kvm和sysctl调用的。在整个过程中,相关的调用似乎是,并且
kvm\u getargv
。要获取命令行参数,首先调用
kvm\u openfiles
访问内核内存空间,然后使用
kvm\u getprocs
获取内核进程信息,然后调用
kvm\u getargv

ps
中使用
sysctl
似乎与您的目标不太相关;它用于获取其他信息,例如组ID和父进程ID。使用的特定sysctl名称是
{CTL_KERN,KERN_PROC,KERN_PROC_which,flags}
,其中指定进程筛选器(例如
ALL
PID
),并且标志是筛选器的参数(详细信息在手册页中)

OSX没有支持procfs,但Singh开发了一个基于GPLv2的版本。如果您将它与应用程序捆绑在一起,您还必须在GPLv2下发布它。大多数MacFUSE都是在a下发布的,因此它可以与你的应用程序一起发布,而无需开源(fusefs/fuse_nodehash.c是在苹果的开源许可下发布的,但它也允许链接到封闭源代码的应用程序)


问题“”应该有用,因为它有使用kvm和sysctl的示例代码。可能对您也有帮助。

kvm函数是我在回答中提到的“noop版本”。它们不起作用。(
sysctl
有,但它不是一个公共界面。)
kvm\uquot/code>手册页和
kvm.h
出现在10.4中(如您链接到的),但在10.5+中消失了。请注意,
ps
源代码中对
kvm
的所有引用都受到
\ifndef\uuuuuu苹果公司
\if FIXME
的保护。我猜开发人员计划在将来实现
kvm.*
,但没有时间(可能永远不会)。文档说,该应用程序将只跟踪“用户应用程序”而不是其他过程。我需要在(系统首选项)UI中指示我的守护进程何时运行/未运行,我不知道如何。。。我是否可以使用更高级别的Obj-CAPI获得这些基本信息?如果没有-你能在解析ps输出时留出一段时间吗?