相关疑难解决方法(0)

从pid获取真正的应用路径?

如何从流程ID获取流程详细信息,如应用程序名称和应用程序的实际路径?

我使用的是Mac OS X.

macos bsd macos-carbon process

20
推荐指数
4
解决办法
2万
查看次数

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

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

目前我正在使用NSWorkspace,注册"确实启动应用程序"通知.我还使用该runningApplications方法来获取应用启动时当前正在运行的应用.

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

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

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

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

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

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

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

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

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

cocoa pid process objective-c command-line-arguments

7
推荐指数
1
解决办法
9803
查看次数

检测 OSX 上的进程退出

我希望在 OSX 上的进程退出之前收到通知,以便我可以在进程终止之前收集有关该进程的统计信息。(示例细节:我想要聚合具有许多子进程的进程的 CPU 使用情况,这些子进程很快生成和死亡,但使用大量 CPU。当通过诸如 之类的东西采样 CPU 使用情况时proc_pidinfo,进程的诞生和死亡速率与我的采样相似我的汇总统计数据中没有充分捕获速率。我希望在进程终止时收到通知,以便我可以总结它们的总用户和系统时间。

到目前为止,看起来效果最好的方法是使用libdtrace,但我不知道如何使用该dtrace命令设置进程退出的探测器,更不用说libdtrace从 C 程序设置了。任何有关设置此类 dtrace 探针的提示以及如何使用的教程libdtrace将不胜感激。

编辑:

好吧,根据一些评论者的建议,我成功创建了一个使用 libdtrace 并可靠地触发进程退出的程序。这很棒,但不幸的是我似乎无法获取正在退出的进程的 PID。看来调用printf()我的 D 程序并尝试格式化整数已严重损坏。具体来说,如果我运行这个程序,该程序应该在进程退出时打印出该进程的名称和 PID,但它会严重失败。它打印一些其他整数,事实上,无论我尝试输出什么,都会打印该整数。如果我将 D 程序从

syscall::*exit*:entry {
    printf(\"%s %d\\n\", execname, curpsinfo->pr_pid);
};
Run Code Online (Sandbox Code Playgroud)

只为了

syscall::*exit*:entry {
    printf(\"%d\\n\", 100);
};
Run Code Online (Sandbox Code Playgroud)

它只是打印出神秘整数的前三位数字。请注意,进程名称是正确的,我相信这只是整数 -> 字符串转换失败。使用上述 D 程序运行主程序dtrace可以正常工作,但我想将其集成到我已经编写了很多内容的 C 程序中,并且将子命令输出通过管道传输到该程序中并不是我想要继续前进的方式。

帮助如何使缓冲输出libdtrace正常工作,或者如何以整数而不是字符串形式获取 PID 会很棒。

c macos

4
推荐指数
1
解决办法
2599
查看次数

获取从另一个用户运行的应用程序的包标识符

场景是这样的:"我从一个用户运行一个app(比如myproc)然后快速用户切换到第二个用户"
现在,当我尝试确定所有使用特定束标识符运行的进程时(比如com.ak.myproc) ; 我无法确定从第一个用户运行的进程.

我尝试过以下但是徒劳无功:

  1. [NSRunningApplication runningApplicationsWithBundleIdentifier:]
  2. [[NSWorkspace sharedWorkspace] runningApplications] 然后比较每个应用程序的包标识符 - 为第一个用户运行的应用程序甚至不显示在此列表中.
  3. 使用sysctl()然后迭代进程列表 - 这里,来自第一个用户的应用程序的pid确实来了.之后:
    • 当我尝试时[NSRunningApplication runningApplicationWithProcessIdentifier:],我没有.
    • 当我尝试GetProcessForPID()跟着时ProcessInformationCopyDictionary(),我得到一个零字典.
    • 当我尝试GetProcessForPID()跟着时GetProcessInformation(),我没有得到任何有用的东西ProcessInfoRec.

有人可以帮忙吗?谢谢.

操作系统:Mac OS X 10.8.4
Xcode:4.6.2

macos sysctl cfbundleidentifier nsworkspace nsrunningapplication

3
推荐指数
1
解决办法
1498
查看次数