Verifica programáticamente si un proceso se está ejecutando en Mac

¿Hay alguna API de carbono / cocoa / C disponible en Macs que pueda usar para enumerar procesos? Estoy buscando algo así como EnumProcesses en Windows.

Mi objective es verificar desde el código si un proceso se está ejecutando (por nombre).

¡Gracias!

Aquí hay algunas implementaciones y detalles específicos, tenga en cuenta que proc-> kp_proc.p_comm tiene un límite de longitud de caracteres por eso estoy implementado infoForPID: en su lugar

Cacao :

[NSWorkspace lanzóAplicaciones] (10.2+, obsoleto en 10.7, listado de procesos muy limitado) [NSWorkspace runningApplications] (10.6+, lista de procesos menos limitada pero que aún no incluye procesos de 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: (ver Technical Q & A QA1123 Obtención de la lista de todos los procesos en 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: El administrador de procesos está, a partir de diciembre de 2013, completamente obsoleto.

Ah, acabo de encontrar la referencia de Process Manager

Parece que GetNextProcess y GetProcessInfo ayudan a determinar qué se está ejecutando. Según lo sugerido por Dave, GetBSDProcessList se puede usar si está buscando daemons y no solo procesos Carbon / Cocoa.

Hay un par de formas en que puede hacer esto:

  1. Si se trata de una aplicación GUI con un icono de Dock, use -[NSWorkspace launchedApplications] .
  2. Desvíe otro proceso (como PS o top o lo que sea) a través de NSTask , lea los resultados y NSTask una búsqueda (o NSTask por grep o algo así).
  3. Utilice la función GetBSDProcessList que se describe aquí: http://developer.apple.com/legacy/mac/library/#qa/qa2001/qa1123.html (He utilizado esto con éxito en el pasado)

En la descripción general de NSRunningApplicationClass , dice:

NSRunningApplication es una clase para manipular y proporcionar información para una sola instancia de una aplicación. Solo se rastrean las aplicaciones de los usuarios; esto no proporciona información sobre cada proceso en el sistema.

y

Para acceder a la lista de todas las aplicaciones en ejecución, use el método runningApplications en NSWorkspace .

Sugeriría echar un vistazo a los temas de progtwigción de los Servicios de área de trabajo