2010-03-25 18 views

Respuesta

8

TechZen dice: El Administrador de procesos es, a Dic 2013, completamente obsoleta.

Ah, acabo de encontrar el Process Manager reference

Parece que GetNextProcess y GetProcessInfo ayuda en averiguar qué está funcionando. Según lo sugerido por Dave, GetBSDProcessList se puede usar si está buscando daemons y no solo procesos de carbono/cacao.

+0

Puede que no desee utilizar estas funciones anteriores ya que Apple puede optar por depreciarlas. Las clases de cacao son generalmente más seguras a este respecto. – ericg

+1

FYI, 'GetBSDProcessList' es * mucho * más rápido que iterar a través del Administrador de procesos usted mismo. –

+2

Process Manager no está (actualmente) en desuso y está disponible en 64 bits. No creo que tenga un hacha como otras API. –

7

Hay un par de maneras que usted puede hacer esto:

  1. Si se trata de una aplicación de interfaz gráfica de usuario con un icono del Dock, utilizar -[NSWorkspace launchedApplications].
  2. Realice otro proceso (como el comando ps o superior o lo que sea) a través de NSTask, lea los resultados y realice una búsqueda (o páselo por grep o algo así).
  3. Utilice la función GetBSDProcessList describe aquí: http://developer.apple.com/legacy/mac/library/#qa/qa2001/qa1123.html (He utilizado este éxito en el pasado)
+2

Hola David, alguna posibilidad de que podría desenterrar una versión actualizada ¿enlazar? Parece que Apple ha reorganizado su sitio de desarrollador, el enlace ya no funciona. ¡Gracias! –

2

En la vista general de la NSRunningApplicationClass, que dice:

NSRunningApplication es una clase de 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, utilice el método runningApplications en NSWorkspace.

que sugeriría un vistazo a Workspace Services Programming Topics

+0

Esos son geniales, si puede limitarse a las aplicaciones GUI en 10.6 –

14

Aquí están algunas implementaciones y detalles específicos, cabe destacar que proc-> kp_proc.p_comm tiene un límite de longitud de caracteres es por eso que estoy implementado infoForPID: en lugar

Cocoa:

[NSWorkspace launchedApplications] (10.2+, en desuso en 10,7, listado proceso muy limitada) [NSWorkspace runningApplications] (10.6+, proceso menos limitada lista pero todavía no incluidos los procesos 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 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; 
} 
+1

Su enlace está roto. – Will

+0

esto es equivalente a usar NSArray * runningApp = [[NSWorkspace sharedWorkspace] runningApplications]; y no funciona para ejecutar la lista de procesos Daemon. – willyMon

+0

@willyMon sí, es equivalente a ejecutar aplicaciones, pero es significativamente más completo que la lista de launchApplications, el enfoque C también da a los daemons – valexa

Cuestiones relacionadas