【问题标题】:Unable to find running application in Cocoa无法在 Cocoa 中找到正在运行的应用程序
【发布时间】:2013-11-17 16:20:54
【问题描述】:

我正在使用以下代码获取 Cocoa 中正在运行的应用程序列表:

for (NSRunningApplication *app in [[NSWorkspace sharedWorkspace] runningApplications]) {
   MNSLog(@"%@",[app localizedName]);
}

但是,我从终端会话启动的应用程序未出现在列表中(“终端”显示良好)。该应用程序是从执行可可代码的同一用户启动的。

我在终端下启动的应用程序吗?在这种情况下,我怎样才能找到它的名称和参数?

在另一个终端会话中运行 ps 可以正确显示我的进程。

【问题讨论】:

  • 你的应用使用窗口服务器吗?
  • 从没有 UI 或以其他方式联系窗口服务器的终端启动的进程不是“应用程序”,以供将来参考 - 它们只是进程。 Apple 文档有时也使用“工具”一词。我认为有些人因此而感到困惑。当你处理这个级别的事情时,通常 Cocoa 不会帮助你。您需要使用较低级别的 BSD(甚至是 Mach,尽管只是作为最后的手段)API。

标签: objective-c macos cocoa process nsworkspace


【解决方案1】:

使用NSTask 执行ps Shell 命令。您可以查看ps 手册页,根据您想要返回的信息确定您想要传递哪些参数。使用NSPipeNSFileHandle 获取任务的结果。

如果您想进行一些过滤,您可以在您的应用获取结果之前通过grep 管道输出ps

对于您的第一个问题,我认为NSWorkspace 只能看到使用窗口服务器的应用程序,因此您只会看到终端,而不是它在内部运行的可执行文件。

【讨论】:

【解决方案2】:

您可以使用sysctlps 命令获取所有BSD 进程的列表。看看unable to detect application running with another user

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-04
    • 2015-12-13
    • 2010-11-30
    • 2013-07-09
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    相关资源
    最近更新 更多