ver tengo que puedo procesos obtener los listado ejecución ejecucion cómo corriendo comando aux c objective-c macos process

tengo - ver procesos en ejecucion linux



Recuperar nombres de procesos en ejecución (3)

En primer lugar, sé que se han formulado preguntas similares, pero las respuestas proporcionadas no han sido muy útiles hasta ahora (todas recomiendan una de las siguientes opciones).

Tengo una aplicación de usuario que necesita determinar si se está ejecutando un proceso en particular. Esto es lo que sé sobre el proceso:

  • El nombre
  • El usuario ( root )
  • Ya debería estar en ejecución, ya que es un LaunchDaemon, lo que significa
  • Su proceso padre debe ser launchd (pid 1)

He intentado varias formas de conseguir esto, pero ninguna ha funcionado hasta ahora. Esto es lo que he intentado:

  1. Ejecutando ps y analizando la salida. Esto funciona, pero es lento ( fork / exec es caro), y me gustaría que fuera lo más rápido posible.

  2. Usando la función GetBSDProcessList listada aquí . Esto también funciona, pero la forma en que dicen recuperar el nombre del proceso (acceder a kp_proc.p_comm desde cada estructura kinfo_proc ) es errónea. El char* resultante char* solo contiene los primeros 16 caracteres del nombre del proceso, que se pueden ver en la definición de la estructura kp_proc :

    #define MAXCOMLEN 16 //defined in param.h struct extern_proc { //defined in proc.h ...snip... char p_comm[MAXCOMLEN+1]; ...snip... };

  3. Usando libProc.h para recuperar información del proceso:

    pid_t pids[1024]; int numberOfProcesses = proc_listpids(PROC_ALL_PIDS, 0, NULL, 0); proc_listpids(PROC_ALL_PIDS, 0, pids, sizeof(pids)); for (int i = 0; i < numberOfProcesses; ++i) { if (pids[i] == 0) { continue; } char name[1024]; proc_name(pids[i], name, sizeof(name)); printf("Found process: %s/n", name); }

    Esto funciona, excepto que tiene el mismo defecto que GetBSDProcessList . Solo se devuelve la primera parte del nombre del proceso.

  4. Usando la función ProcessManager en Carbon:

    ProcessSerialNumber psn; psn.lowLongOfPSN = kNoProcess; psn.highLongOfPSN = 0; while (GetNextProcess(&psn) == noErr) { CFStringRef procName = NULL; if (CopyProcessName(&psn, &procName) == noErr) { NSLog(@"Found process: %@", (NSString *)procName); } CFRelease(procName); }

    Esto no funciona. Solo devuelve el proceso registrado con el WindowServer (o algo así). En otras palabras, solo devuelve aplicaciones con UI, y solo para el usuario actual.

  5. No puedo usar -[NSWorkspace launchedApplications] , ya que debe ser compatible con 10.5. Además, esto solo devuelve información sobre las aplicaciones que aparecen en el Dock para el usuario actual.

Sé que es posible recuperar el nombre de los procesos en ejecución (ya que ps puede hacerlo), pero la pregunta es "¿Puedo hacerlo sin bifurcar y ejecutar ps ?".

¿Alguna sugerencia?

EDITAR

Después de hacer mucha más investigación, no he podido encontrar una manera de hacer esto. Encontré esta pregunta SO , que se refería a este archivo C en un módulo de python . Esto fue realmente útil al tratar de usar los valores de KERN_PROCARGS en una llamada a sysctl .

Sin embargo, el código del módulo Python parecía derivar de la fuente a ps , que encontré aquí . ps alguna manera, ps puede obtener la ruta ejecutable de cada proceso en ejecución, pero mis mejores esfuerzos para extraer cómo esto no ha tenido éxito. Hay una función en print.c llamada getproclline que parece estar haciendo la magia, pero cuando ejecuto el mismo código desde mi propia herramienta de línea de comandos, no puedo recuperar el ejecutable del proceso para ningún otro proceso que no sea el mío.

Seguiré experimentando, pero sin más evidencia concluyente, parece que la respuesta de @ drawnonward es la más correcta hasta ahora.

EDITAR (mucho tiempo después)

Gracias a la respuesta apuntada por Quinn Taylor , he encontrado algo que funciona. Obtiene la ruta ejecutable de cada proceso, y luego puedo tomar el último componente de la ruta para obtener el nombre del proceso real.

#import <sys/proc_info.h> #import <libproc.h> int numberOfProcesses = proc_listpids(PROC_ALL_PIDS, 0, NULL, 0); pid_t pids[numberOfProcesses]; bzero(pids, sizeof(pids)); proc_listpids(PROC_ALL_PIDS, 0, pids, sizeof(pids)); for (int i = 0; i < numberOfProcesses; ++i) { if (pids[i] == 0) { continue; } char pathBuffer[PROC_PIDPATHINFO_MAXSIZE]; bzero(pathBuffer, PROC_PIDPATHINFO_MAXSIZE); proc_pidpath(pids[i], pathBuffer, sizeof(pathBuffer)); if (strlen(pathBuffer) > 0) { printf("path: %s/n", pathBuffer); } }


¿Qué hay de esta respuesta a una pregunta relacionada? https://.com/a/12274588/120292 Esto pretende obtener la ruta completa para un proceso por el pid, y puede tomar solo el último componente de ruta.


La única lista completa de procesos en ejecución se proporciona en 2 arriba, preguntando al kernel. Obtener el nombre real del proceso no es sencillo. En pocas palabras, busca el pid en cualquier otra fuente que puedas encontrar hasta que obtengas una coincidencia.

Para algunos procesos, funcionará lo siguiente:

ProcessSerialNumber psn; CFStringRef name = NULL; status = GetProcessForPID( inPID , &psn ); if ( noErr == status ) CopyProcessName( &psn , &name );

Para algunos procesos, puede buscar el pid en los resultados de [[NSWorkspace sharedWorkspace] launchedApplications] por NSApplicationProcessIdentifier . Disponible con 10.2 y posteriores. La mayoría, pero tal vez no todos, los elementos en esta lista serán los mismos que CopyProcessName arriba.

Para algunos procesos, puede buscar los argumentos del proceso y obtener la ruta completa desde el primer argumento. Similar a obtener la lista original, pero usando KERN_PROCARGS o KERN_PROCARGS2 como el segundo valor mib. Esto es lo que está haciendo ps .

Para algunos procesos, estás atascado con el p_comm de 16 caracteres.


No estoy seguro de si esto es lo que estás buscando, pero ¿podrías usar la API LaunchServices con __ LSCopyApplicationArrayInFrontToBackOrder ? He oído hablar de esto, pero nunca lo usé. Después de buscar en Google, aquí hay un ejemplo de código que podría proporcionar lo que estás buscando. Realmente no sé y estoy adivinando un poco;)

http://gist.github.com/163918

Editar

En realidad, ha. Aquí hay una publicación de desbordamiento de pila que ofrece esto como una respuesta y enlaces a la misma publicación a la que he vinculado ...

http://www..com/questions/945033/getting-the-list-of-running-applications-ordered-by-last-use