Ermitteln Sie mithilfe von sysctl, welche App derzeit auf iOS ausgeführt wird

Ich habe derzeit einen einfachen Aktivitätsmonitor implementiert, um alle laufenden Prozesse unter iOS zu überwachen.

So rufen Sie eine Liste aller ausgeführten Prozesse ab:

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 haben möchte, mache ich Folgendes:

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 Prozessinformationen, die ich möchte, sind jetzt in gespeichertproc.

Ich stelle fest, dass Apps vom Betriebssystem nicht beendet werden. Auch wenn eine App längere Zeit (länger als 10 Minuten) nicht verwendet wird, bleibt sie in der Prozessliste. Auch wenn ich nach dem "Status" des Prozesses frage (proc-> kp_proc.p_stat), wird "running" zurückgegeben.

Meine Frage ist: kennt jemand eine Methode, um festzustellen, welche PID gerade läuft / aktiv verwendet wird (vielleicht: Erhöhung der CPU-Zeit? Laufzeit? CPU-Ticks usw.)?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage