Обычный способ сделать это - зайти в C и перечислить серийные номера процессов в системе (возврат к временам до Mac OS X.) NSWorkspace имеет API, но они не всегда работают так, как вы ожидаете.
Обратите внимание, что классические процессы (в системах PowerPC) будут перечисляться с этим кодом (с разными серийными номерами процессов), даже если все они имеют один и тот же идентификатор процесса.
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.
Используя NSRunningApplication
и NSWorkspace
:
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);
}
}
}