2012-09-07 7 views
13

Ich habe derzeit einen einfachen Aktivitätsmonitor implementiert, um alle laufenden Prozesse auf iOS zu überwachen.Ermitteln, welche App derzeit unter iOS mit sysctl ausgeführt wird

Um eine Liste aller laufenden Prozesse abrufen, ich dies tun:

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 

Und wenn ich mehr Informationen zu einem bestimmten Prozess wollen, werde ich tun:

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); 

alle zusätzlichen proc info Ich möchte jetzt in proc gespeichert werden.

Ich merke, dass Apps vom Betriebssystem nicht getötet werden. Auch wenn eine App längere Zeit nicht benutzt wird (länger als 10 Minuten), bleibt sie in der Prozessliste. Selbst wenn ich abfrage, welchen "Zustand" der Prozess hat (proc-> kp_proc.p_stat), gibt er "running" zurück.

Meine Frage ist: Kennt jemand eine Methode, um festzustellen, welche PID gerade läuft/aktiv verwendet wird (vielleicht: CPU-Zeit erhöhen? Laufzeit? CPU-Ticks etc.) ??

+0

Zuerst habe ich eine Frage an Sie. Wenn der Wert von p_stat 2 ist, bedeutet dies, dass dieser Prozess ausgeführt wird? Als ich auf dem Simulator lief, fand ich, dass ein Teil des Prozesses einen p_stat-Wert von 5 hatte. Außerdem fand ich, dass alle Werte für Tick oder CPU-Zeit 0 sind. Es scheint, dass diese Werte niemals in darwin stat sind. Ich weiß nicht, ob es bei freiem BSD gleich ist. – HChen

+0

Nein. Werte scheinen sich nirgends zu ändern ... also kein Hinweis auf einen laufenden Prozess von sysctl – hackerdiehack

+1

@hackerdiehack Weißt du, wie man herausfinden kann, wenn der Prozess im Vordergrund oder Hintergrund ist? –

Antwort

2

Beantwortung der „aktuell laufenden“ Teil Ihrer Frage:

ich den Code aus dieser Antwort verwendet Can we retrieve the applications currently running in iPhone and iPad

Sah nach den k_proc Erklärungen hier: http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/bsd/sys/proc.h

mit Versuch und Irrtum festgestellt, dass Die Prozesse, bei denen p_flag auf 18432 gesetzt ist, ist die aktuell ausgeführte Anwendung (in diesem Fall der Test).

den ersten Link sehen, und das Innere des ersetzen für den Zyklus mit:

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

das scheint nicht für mich zu funktionieren ... wie überprüfen Sie das? Ich habe folgendes versucht: kp_proc.p_flag == 18432 – hackerdiehack

+0

Leider gibt dies nur die aktuelle App zurück, die debuggt wird: / – hackerdiehack