gpt4 book ai didi

objective-c - 苹果操作系统 X : Getting detailed process information (specifically its launch arguments) for arbitrary running applications using its PID

转载 作者:太空狗 更新时间:2023-10-30 03:36:22 25 4
gpt4 key购买 nike

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

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

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

在您遇到一个应用程序充当使用命令行参数启动另一个应用程序的代理之前,这一切正常。

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

由于更多基于 Source 的游戏正在转向 Mac,我想他们会使用相同的方法启动,有效地运行带有 -game 参数的 hl2_osx 应用程序.

是否有使用 Cocoa API 获取参数(及其参数)列表的好方法?

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

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

有什么可以填补两者之间的空白吗?

我尽量不沿着生成 NSTask 的路线运行 ps -p [pid] 并解析输出...我更喜欢更高层次的东西。

最佳答案

你可以使用任何ps使用,虽然它不是基于 cocoa 的。根据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_<em>which</em>, <em>flags</em>} ,其中 which 指定进程过滤器(例如 ALLPID )和 flags 是过滤器的参数(详细信息在 sysctl 手册页中) .

OS X 不支持 procfs,但 Singh 开发了一个 FUSE based version , 在 GPLv2 下发布。如果您将它与您的应用程序捆绑在一起,您也必须在 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"也可能对您有用。

关于objective-c - 苹果操作系统 X : Getting detailed process information (specifically its launch arguments) for arbitrary running applications using its PID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2838190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com