Controlla a livello di codice se un processo è in esecuzione su Mac

È disponibile su Mac Mac un’API Carbon / Cocoa / C che possa essere utilizzata per enumerare i processi? Sto cercando qualcosa come EnumProcesses su Windows.

Il mio objective è verificare dal codice se un processo è in esecuzione (per nome).

Grazie!

Ecco alcune implementazioni e dettagli specifici, nota che proc-> kp_proc.p_comm ha un limite di lunghezza del carattere, ecco perché sono implementato infoForPID: invece

Cacao:

[NSWorkspace ha lanciatoApplicazioni] (10.2+, deprecato in 10.7, elenco dei processi molto limitato) [NSWorkspace runningApplications] (10.6+, elenco dei processi meno limitato ma ancora non includendo i processi demone)

Carbonio:

 - (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: (vedi Domande e risposte tecniche QA1123 Ottenere l’elenco di tutti i processi su 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 dice: Il Process Manager è, a partire dal dicembre 2013, completamente deprecato.

Ah, ho appena trovato il riferimento di Process Manager

Sembra che GetNextProcess e GetProcessInfo aiutino a capire cosa è in esecuzione. Come suggerito da Dave, GetBSDProcessList può essere usato se stai cercando demoni e non solo processi di Carbon / Cocoa.

Ci sono un paio di modi in cui puoi farlo:

  1. Se si tratta di un’app GUI con l’icona di un Dock, utilizzare -[NSWorkspace launchedApplications] .
  2. NSTask un altro processo (come ps o top o altro) tramite un NSTask , leggi i risultati e cerca te stesso (o NSTask attraverso grep o qualcosa del genere).
  3. Usa la funzione GetBSDProcessList qui descritta: http://developer.apple.com/legacy/mac/library/#qa/qa2001/qa1123.html (l’ho usato con successo in passato)

Nella panoramica di NSRunningApplicationClass , dice:

NSRunningApplication è una class per manipolare e fornire informazioni per una singola istanza di un’applicazione. Vengono monitorate solo le applicazioni utente; questo non fornisce informazioni su ogni processo sul sistema.

e

Per accedere all’elenco di tutte le applicazioni in esecuzione, utilizzare il metodo runningApplications in NSWorkspace .

Suggerirei di dare un’occhiata ai temi di programmazione dei servizi Workspace