Programaticamente, verifique se um processo está sendo executado no Mac

Existe alguma API Carbon / Cocoa / C disponível em Macs que eu possa usar para enumerar processos? Eu estou procurando por algo como EnumProcesses no Windows.

Meu objective é verificar a partir do código se um processo está sendo executado (por nome).

Obrigado!

Aqui estão algumas implementações e detalhes específicos, note que proc-> kp_proc.p_comm tem um limite de comprimento de caracteres é por isso que eu estou implementado infoForPID:

cocoa:

[NSWorkspace launchApplications] (10.2+, descontinuado em 10.7, listview de processos muito limitada) [NSWorkspace runningApplications] (10.6+, menos lista de processos limitada, mas ainda não incluindo processos daemon)

Carbono:

 - (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: (consulte Q & A técnico QA1123 Obtendo lista de todos os processos no 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 diz: O Gerenciador de Processos está, a partir de dezembro de 2013, completamente obsoleto.

Ah, acabei de encontrar a referência do Gerenciador de processos

Parece que GetNextProcess e GetProcessInfo ajudam a descobrir o que está sendo executado. Como sugerido por Dave, GetBSDProcessList pode ser usado se você estiver procurando por daemons e não apenas processos de Carbono / cocoa.

Existem algumas maneiras de fazer isso:

  1. Se for um aplicativo GUI com um ícone do Dock, use -[NSWorkspace launchedApplications] .
  2. Afastar outro processo (como ps ou top ou qualquer outro) através de uma NSTask , ler os resultados e procurar por você mesmo (ou canalizá-lo através do grep ou algo assim).
  3. Use a function GetBSDProcessList descrita aqui: http://developer.apple.com/legacy/mac/library/#qa/qa2001/qa1123.html (já usei isso com sucesso no passado)

Na visão geral do NSRunningApplicationClass , ele diz:

NSRunningApplication é uma class para manipular e fornecer informações para uma única instância de um aplicativo. Apenas aplicativos do usuário são rastreados; isso não fornece informações sobre todos os processos no sistema.

e

Para acessar a lista de todos os aplicativos em execução, use o método runningApplications no NSWorkspace .

Sugiro dar uma olhada nos tópicos de programação de serviços de espaço de trabalho