Programmatically check if a process is running on Mac Programmatically check if a process is running on Mac unix unix

Programmatically check if a process is running on Mac


Here are some specific implementations and details, note that proc->kp_proc.p_comm has a character length limit that's why I'm implemented infoForPID: instead

Cocoa :

[NSWorkspace launchedApplications] (10.2+ , deprecated in 10.7, very limited process listing) [NSWorkspace runningApplications] (10.6+ , less limited process listing but still not including daemon processes)

Carbon :

- (NSArray*)getCarbonProcessList{    NSMutableArray *ret = [NSMutableArray arrayWithCapacity:1];    ProcessSerialNumber psn = { kNoProcess, kNoProcess };    while (GetNextProcess(&psn) == noErr) {        CFDictionaryRef cfDict = ProcessInformationCopyDictionary(&psn,  kProcessDictionaryIncludeAllInformationMask);        if (cfDict) {            NSDictionary *dict = (NSDictionary *)cfDict;            [ret addObject:[NSDictionary dictionaryWithObjectsAndKeys:                            [NSString stringWithFormat:@"%@",[dict objectForKey:(id)kCFBundleNameKey]],@"pname",                            [NSString stringWithFormat:@"%@",[dict objectForKey:@"pid"]],@"pid",                            [NSString stringWithFormat:@"%d",(uid_t)getuid()],@"uid",                                                                           nil]];             CFRelease(cfDict);                  }    }    return ret;}

C: (see Technical Q&A QA1123 Getting List of All Processes on Mac OS X )

- (NSArray*)getBSDProcessList{    NSMutableArray *ret = [NSMutableArray arrayWithCapacity:1];    kinfo_proc *mylist;    size_t mycount = 0;    mylist = (kinfo_proc *)malloc(sizeof(kinfo_proc));    GetBSDProcessList(&mylist, &mycount);    int k;    for(k = 0; k < mycount; k++) {        kinfo_proc *proc = NULL;        proc = &mylist[k];        NSString *fullName = [[self infoForPID:proc->kp_proc.p_pid] objectForKey:(id)kCFBundleNameKey];        if (fullName == nil) fullName = [NSString stringWithFormat:@"%s",proc->kp_proc.p_comm];        [ret addObject:[NSDictionary dictionaryWithObjectsAndKeys:                        fullName,@"pname",                        [NSString stringWithFormat:@"%d",proc->kp_proc.p_pid],@"pid",                        [NSString stringWithFormat:@"%d",proc->kp_eproc.e_ucred.cr_uid],@"uid",                                                                       nil]];                                                }    free(mylist);      return ret;}- (NSDictionary *)infoForPID:(pid_t)pid {    NSDictionary *ret = nil;    ProcessSerialNumber psn = { kNoProcess, kNoProcess };    if (GetProcessForPID(pid, &psn) == noErr) {        CFDictionaryRef cfDict = ProcessInformationCopyDictionary(&psn,kProcessDictionaryIncludeAllInformationMask);         ret = [NSDictionary dictionaryWithDictionary:(NSDictionary *)cfDict];        CFRelease(cfDict);    }    return ret;}


TechZen says: The Process Manager is, as of Dec 2013, completely deprecated.

Ah, I just found the Process Manager reference

Looks like GetNextProcess and GetProcessInfo help in figuring out what's running. As suggested by Dave, GetBSDProcessList can be used if you're looking for daemons and not just Carbon/Cocoa processes.


There are a couple ways you can do this:

  1. If it's a GUI app with a Dock icon, use -[NSWorkspace launchedApplications].
  2. Fork off another process (like ps or top or whatever) via an NSTask, read the results, and search yourself (or pipe it through grep or something).
  3. Use the GetBSDProcessList function described here: http://developer.apple.com/legacy/mac/library/#qa/qa2001/qa1123.html (I've used this successfully in the past)