如何在程序中获取进程ID(PID)?

6

我该如何获取进程ID?我需要这个ID来结束该进程。我知道该进程的名称。

谢谢!


我们是在谈论任何进程还是你的应用程序? - Deepak Danduprolu
任何进程。对于您自己的应用程序,使用 getpid 很容易获取 PID。 - Alex
5个回答

5
最好的方法是使用 -[NSWorkspace launchedApplications] 获取10.5及以下版本的应用程序,以及使用 -[NSWorkspace runningApplicattions] 获取10.6及以上版本的应用程序。前者返回一个包含指定键值的字典,包括进程ID和捆绑名称以及位置信息(如果可用),而后者返回一个NSRunningApplication对象。

1
那为什么它更好呢?归根结底,它仍然会转到那个 C 级别的 API。因此,如果您已经有一个 C 程序,为什么还要费心使用 Objective-C 呢? - user405725
只有在Objective-C应用程序中才更好;当人们在OS X上寻求编程帮助时,这是一个合理的假设。在普通的C语言中,一个普通的C库显然更好。很抱歉花了这么长时间——我没有收到有关评论的电子邮件。 - nomothetis

5
let pid: Int32 = ProcessInfo.processInfo.processIdentifier
print("pid: \(pid)")

2

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

更新:哦,我第一次没有注意到OSX。对于OS X,您必须使用NetBSD API(别问为什么)。请参阅KVM(内核数据访问库)文档。API不同,但思路仍然相同。


NetBSD?!OS X 不是基于FreeBSD和Mach内核吗? - JustSid
可能是FreeBSD。我所知道的是这个API与NetBSD类似,也许FreeBSD也有相同的API。 - user405725

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

注意:-[NSWorkspace launchedApplications]在10.6及以上版本中已被弃用。

来自苹果公司: NSRunningApplication是一个用于操作和提供单个应用程序实例信息的类。只有用户应用程序被跟踪; 它不提供关于系统上每个进程的信息。 - Jeff Brown

1
一个快速的技巧:生成一个 shell 调用 killall,通过进程名称来杀死一个进程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接