【问题标题】:osx - How to get a process id (PID) programmatically?osx - 如何以编程方式获取进程 ID (PID)?
【发布时间】:2011-09-07 02:10:33
【问题描述】:

如何获取进程的 ID?我需要 ID 才能终止该进程。我知道进程的名称。

谢谢!

【问题讨论】:

  • 我们在谈论任何流程或您的应用程序吗?
  • 任何进程。对于您自己的应用程序,使用 getpid 获取 PID 相当简单

标签: macos process kill pid


【解决方案1】:

最好的方法是对 10.5- 使用 -[NSWorkspace launchedApplications],对 10.6+ 应用使用 -[NSWorkspace runningApplicattions]。一个返回具有指定键的字典,包括进程 ID 和包名称和位置信息(如果可用),另一个返回 NSRunningApplication 对象。

【讨论】:

  • 为什么它更好?归根结底,它仍然会转到那个 C 级 API。因此,如果您已经有一个 C 程序,为什么还要使用 Objective-C?
  • 只有在 Objective-C 应用程序中才会更好;当人们在 OS X 上寻找编程帮助时,这是一个合理的假设。在纯 C 中,纯 C 库显然更好。抱歉花了这么长时间——我没有收到有关评论的电子邮件。
【解决方案2】:
let pid: Int32 = ProcessInfo.processInfo.processIdentifier
print("pid: \(pid)")

【讨论】:

    【解决方案3】:

    首先,进程名不是唯一标识进程的。可能有许多进程具有相同的名称,或者进程甚至可以在您看到它们时更改它们的名称(即 PostgreSQL 服务器正在分叉并更改 argv[0],因此您可以看到谁是主进程,谁是工作进程等)。但无论如何,您将需要一个 API 来列出进程并获取其详细信息 - procps 会为您完成。

    更新:哦,我第一次没有注意到 OSX。对于 OS X,您必须使用 NetBSD API(不要问)。请参阅KVM (Kernel Data Access Library) 文档。 API不同了,思路还是一样的。

    【讨论】:

    • NetBSD?! OS X 不是 FreeBSD 和 Mach 内核吗?
    • 可能是 FreeBSD。据我所知,这个 API 与 NetBSD 的类似,也许 FreeBSD 也有。
    【解决方案4】:

    快速破解:生成一个对 killall 的 shell 调用,它按名称杀死一个进程。

    【讨论】:

      【解决方案5】:

      使用NSRunningApplication

      NSArray *runningApplications = [NSRunningApplication runningApplicationsWithBundleIdentifier:@"com.bundleIdentifier"];
      if (runningApplications.count == 1) {
          NSRunningApplication *app = runningApplications[0];
          pid = [app processIdentifier];
      }
      

      注意:-[NSWorkspace launchedApplications] 对于 10.6 及更高版本已弃用。

      【讨论】:

      • 来自 Apple:NSRunningApplication 是一个类,用于为应用程序的单个实例操作和提供信息。 仅跟踪用户应用程序;这并不提供有关系统上每个进程的信息。
      猜你喜欢
      • 2010-12-04
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2013-06-01
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      • 2017-01-06
      相关资源
      最近更新 更多