时间:2010-07-26 12:06:47

标签: objective-c macos cocoa process

3 个答案:

答案 0 :(得分:6)

通常的方法是进入C并通过系统上的进程序列号进行枚举(回到Mac OS X之前的几天).NSWorkspace有API,但它们并不总是以您期望的方式工作

请注意,经典流程(在PowerPC系统上)将使用此代码进行枚举(具有不同的流程序列号),即使它们共享一个流程ID。

void DoWithProcesses(void (^ callback)(pid_t)) {
    ProcessSerialNumber psn = { 0, kNoProcess };
    while (noErr == GetNextProcess(&psn)) {
        pid_t pid;
        if (noErr == GetProcessPID(&psn, &pid)) {
            callback(pid);
        }
    }
}

然后,您可以调用该函数并传递一个块,该块将使用PID执行您想要的操作。


使用NSRunningApplicationNSWorkspace

void DoWithProcesses(void (^ callback)(pid_t)) {
    NSArray *runningApplications = [[NSWorkspace sharedWorkspace] runningApplications];
    for (NSRunningApplication *app in runningApplications) {
        pid_t pid = [app processIdentifier];
        if (pid != ((pid_t)-1)) {
            callback(pid);
        }
    }
}

答案 1 :(得分:3)

您可以使用BSD sysctl例程或ps命令获取所有BSD进程的列表。看看https://stackoverflow.com/a/18821357/944634

答案 2 :(得分:1)