【发布时间】:2011-09-07 02:10:33
【问题描述】:
如何获取进程的 ID?我需要 ID 才能终止该进程。我知道进程的名称。
谢谢!
【问题讨论】:
-
我们在谈论任何流程或您的应用程序吗?
-
任何进程。对于您自己的应用程序,使用
getpid获取 PID 相当简单
如何获取进程的 ID?我需要 ID 才能终止该进程。我知道进程的名称。
谢谢!
【问题讨论】:
getpid 获取 PID 相当简单
最好的方法是对 10.5- 使用 -[NSWorkspace launchedApplications],对 10.6+ 应用使用 -[NSWorkspace runningApplicattions]。一个返回具有指定键的字典,包括进程 ID 和包名称和位置信息(如果可用),另一个返回 NSRunningApplication 对象。
【讨论】:
let pid: Int32 = ProcessInfo.processInfo.processIdentifier
print("pid: \(pid)")
【讨论】:
首先,进程名不是唯一标识进程的。可能有许多进程具有相同的名称,或者进程甚至可以在您看到它们时更改它们的名称(即 PostgreSQL 服务器正在分叉并更改 argv[0],因此您可以看到谁是主进程,谁是工作进程等)。但无论如何,您将需要一个 API 来列出进程并获取其详细信息 - procps 会为您完成。
更新:哦,我第一次没有注意到 OSX。对于 OS X,您必须使用 NetBSD API(不要问)。请参阅KVM (Kernel Data Access Library) 文档。 API不同了,思路还是一样的。
【讨论】:
快速破解:生成一个对 killall 的 shell 调用,它按名称杀死一个进程。
【讨论】:
使用NSRunningApplication
NSArray *runningApplications = [NSRunningApplication runningApplicationsWithBundleIdentifier:@"com.bundleIdentifier"];
if (runningApplications.count == 1) {
NSRunningApplication *app = runningApplications[0];
pid = [app processIdentifier];
}
注意:-[NSWorkspace launchedApplications] 对于 10.6 及更高版本已弃用。
【讨论】: