Macos osx-如何以编程方式获取进程id(PID)?

Macos osx-如何以编程方式获取进程id(PID)?,macos,process,kill,pid,Macos,Process,Kill,Pid,如何获取进程ID?我需要ID才能终止该进程。我知道这个过程的名称 谢谢 首先,流程名称不是唯一标识流程的名称。可能有许多进程具有相同的名称,或者进程甚至可以在您看到它们时更改它们的名称(例如,PostgreSQL server正在分叉并更改argv[0],以便您可以看到谁是主进程,谁在处理进程等)。但是无论如何,你需要一个API来列出进程并获取它们的详细信息——这会帮你做到的 更新:哦,我第一次没有注意到OSX。对于OSX,您必须使用NetBSDAPI(不要问)。请参阅文件。API不同,想法仍然

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


谢谢

首先,流程名称不是唯一标识流程的名称。可能有许多进程具有相同的名称,或者进程甚至可以在您看到它们时更改它们的名称(例如,PostgreSQL server正在分叉并更改argv[0],以便您可以看到谁是主进程,谁在处理进程等)。但是无论如何,你需要一个API来列出进程并获取它们的详细信息——这会帮你做到的


更新:哦,我第一次没有注意到OSX。对于OSX,您必须使用NetBSDAPI(不要问)。请参阅文件。API不同,想法仍然相同。

快速破解:生成对killall的shell调用,它按名称终止进程。

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

使用
NSRunningApplication

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

注意:
-[NSWorkspace launchedApplications]
不推荐用于10.6及以上版本。

我们讨论的是任何流程还是您的应用程序?任何流程。对于您自己的应用程序,使用
getpid
NetBSD获取PID非常简单?!OSX不是FreeBSD和Mach内核吗?可能是FreeBSD。据我所知,这个API与NetBSD类似,也许FreeBSD也有相同的API。为什么它更好呢?最终,它仍将进入C级API。所以,如果你已经有了一个C程序,为什么还要用Objective-C呢?只有在Objective-C应用程序中才更好;当人们在OS X上寻找编程帮助时,这是一个合理的假设。在普通C中,普通C库显然更好。很抱歉,花了这么长时间,我没有收到有关评论的电子邮件。来自Apple:NSRunningApplication是一个类,用于操作应用程序的单个实例并为其提供信息。只跟踪用户应用程序;这并不提供有关系统上每个进程的信息。
let pid: Int32 = ProcessInfo.processInfo.processIdentifier
print("pid: \(pid)")