代码之家  ›  专栏  ›  技术社区  ›  Jasarien

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

  •  7
  • Jasarien  · 技术社区  · 15 年前

    我正在尝试检测特定应用程序何时启动。

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

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

    在遇到一个应用程序,它充当使用命令行参数启动另一个应用程序的代理之前,这是可以正常工作的。

    示例:Mac上新发布的门户没有专用的应用程序包。蒸汽可以创造一条捷径,除了启动 hl2_osx 应用程序与 -game 论证与 portal 作为参数。

    由于越来越多的源代码游戏正在向Mac进军,我想他们将使用相同的方法来启动,有效地运行 HL2O-OSX 应用程序与 游戏 争论。

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

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

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

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

    我试着不走下产卵的路线 NSTask 运行 ps -p [pid] 正在分析输出…我更喜欢高级的。

    2 回复  |  直到 8 年前
        1
  •  8
  •   Pang Ajmal PraveeN    8 年前

    你可以用任何东西 ps 使用,虽然它不是可可基的。根据 Singh , 聚苯乙烯 基于kvm和sysctl调用。倾泻而过 source 有针对性的呼吁似乎是 kvm_openfiles , kvm_getprocs kvm_getargv . 要获取命令行参数,请首先调用 KvMyOpenFrm 要访问内核内存空间,请使用 KVMY-GETPROCS 获取内核进程信息,然后 克维姆盖塔尔夫 .

    使用 sysctl 在里面 聚苯乙烯 似乎与您的目标不太相关;它用于获取其他信息,如组ID和父进程ID。使用的特定sysctl名称是 {CTL_KERN, KERN_PROC, KERN_PROC_ which , flags } 在哪里 哪一个 指定进程筛选器(例如 ALL , PID ) 旗帜 是筛选器的参数(详细信息位于 sysctl 人页)。

    OS X没有支持procfs,但singh开发了一个 FUSE based version ,根据GPLV2发布。如果您将它与您的应用程序捆绑在一起,那么您也必须在gplv2下发布它。大多数MacFuse是在 BSD-style license 因此,它可以与您的应用程序一起分发,而无需将其设为开源(fusefs/fuse-nodehash.c是根据苹果的开源许可证发布的,但它也允许链接到闭源应用程序)。

    “问题” Get other process' argv in OS X using C “应该可以使用,因为它有使用kvm和sysctl的示例代码。 TN 2050 "Observing Process Lifetimes Without Polling" 也可能对你有用。

        2
  •  4
  •   Nicholas Riley    15 年前

    不跑步 ps 是你最好的选择。OS X不支持标准的进程信息接口(在OS X 10.4中提供了noop版本,但后来删除了),并且私有接口可能在OS X版本之间发生更改。

    如果您愿意将自己锁定到单个OS X版本中,那么所有源代码都是可用的,例如 ps libproc ;您还需要以根用户身份运行。