Wykryj, która aplikacja jest aktualnie uruchomiona na iOS za pomocą sysctl

Obecnie zaimplementowałem prosty monitor aktywności, aby oglądać wszystkie uruchomione procesy na iOS.

Aby pobrać listę wszystkich uruchomionych procesów, robię to:

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

A jeśli chcę uzyskać więcej informacji na temat określonego procesu, zrobię to:

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

Wszystkie dodatkowe informacje o proc, których chcę, są teraz przechowywaneproc.

Zauważam, że aplikacje nie zostaną zabite przez system operacyjny. Nawet jeśli aplikacja nie jest używana przez dłuższy czas (dłużej niż 10 minut), pozostanie na liście procesów. Nawet gdy zapytam o „stan” procesu (proc-> kp_proc.p_stat), zwraca „running”.

Moje pytanie brzmi: czy ktoś zna metodę wykrywania, który PID jest aktualnie uruchomiony / aktywnie używany (może: zwiększenie czasu procesora? Czas działania? Cpu ticks itp.)?

questionAnswers(1)

yourAnswerToTheQuestion