2012-09-07 13 views
13

Actualmente he implementado un monitor de actividad simple para ver todos los procesos en ejecución en iOS.Detectar qué aplicación se está ejecutando actualmente en iOS usando sysctl

para recuperar una lista de todos los procesos en ejecución, hago esto:

size_t size; 
struct kinfo_proc *procs = NULL; 
int status; 
NSMutableArray *killedProcesses = [[NSMutableArray alloc] init]; 

int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0 }; 

status = sysctl(mib, 4, NULL, &size, NULL, 0); 
procs = malloc(size); 
status = sysctl(mib, 4, procs, &size, NULL, 0); 

// now, we have a nice list of processes 

Y si quiero más información acerca de un proceso específico, lo haré:

struct kinfo_proc *proc; 
int mib[5] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, pidNum, 0 }; 
int count; 
size_t size = 0; 

// ask the proc size 
if(sysctl(mib, 4, NULL, &size, NULL, 0) < 0) return -1; 

// allocate memory for proc 
proc = (struct kinfo_proc *)malloc(size); 

sysctl(mib, 4, proc, &size, NULL, 0); 

Todo el extra La información de proceso que deseo ahora está almacenada en proc.

Me di cuenta de que el sistema operativo no matará a las aplicaciones. Incluso cuando una aplicación no se utiliza durante un tiempo prolongado (más de 10 minutos), permanecerá en la lista de procesos. Incluso cuando consulto qué "estado" tiene el proceso (proc-> kp_proc.p_stat), devuelve "en ejecución".

Mi pregunta es: ¿alguien sabe un método para detectar qué PID se está ejecutando actualmente/de forma activa (tal vez: aumentando el tiempo de la CPU? Tiempo de ejecución? Cpu ticks, etc.) ??

+0

En primer lugar, Tengo una pregunta para usted. Cuando el valor de p_stat es 2, ¿significa esto que este proceso se está ejecutando? Cuando corro en el simulador, descubrí que algunos de los procesos tienen un valor de p_stat de 5. Además, encontré que todos los valores para tick o cpu time son 0. Parece que estos valores nunca son stat en darwin. No sé si es lo mismo en BSD gratis. – HChen

+0

No. Los valores no parecen cambiar en ningún lado ... así que no hay indicación de un proceso en ejecución desde sysctl hasta ahora – hackerdiehack

+1

@hackerdiehack ¿Sabes cómo saber cuándo el proceso está en primer plano o en segundo plano? –

Respuesta

2

Respondiendo a la "actualmente en ejecución" parte de su pregunta:

he utilizado el código de esta respuesta Can we retrieve the applications currently running in iPhone and iPad

cuidaron las declaraciones k_proc aquí: http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/bsd/sys/proc.h

con ensayo y error descubrió que los procesos con p_flag establecido en 18432 es la aplicación actualmente en ejecución (en este caso esta prueba).

Véase el primer enlace, y sustituir el interior de la de ciclo con:

if (process[i].kp_proc.p_flag == 18432){ 

         NSString * processID = [[NSString alloc] initWithFormat:@"%d", process[i].kp_proc.p_pid]; 
         NSString * processName = [[NSString alloc] initWithFormat:@"%s", process[i].kp_proc.p_comm]; 
         NSString * status  = [[NSString alloc] initWithFormat:@"%d",process[i].kp_proc.p_flag ]; 

         NSDictionary * dict = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:processID, processName,status, nil] 
                      forKeys:[NSArray arrayWithObjects:@"ProcessID", @"ProcessName",@"flag", nil]]; 

         [array addObject:dict]; 

} 
+0

que no parece funcionar para mí ... ¿cómo se comprueba esto? Intenté lo siguiente: kp_proc.p_flag == 18432 – hackerdiehack

+0

desafortunadamente, esto solo devuelve la aplicación actual que se está depurando: / – hackerdiehack

Cuestiones relacionadas