Определите, какое приложение в данный момент работает на iOS, используя sysctl

В настоящее время я реализовал простой монитор активности для наблюдения за всеми запущенными процессами на iOS.

Чтобы получить список всех запущенных процессов, я делаю это:

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

И если мне нужна дополнительная информация о конкретном процессе, я сделаю:

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

Вся необходимая мне дополнительная информация теперь хранится вproc.

Я заметил, что ОС не будет убивать приложения. Даже если приложение не используется в течение длительного времени (более 10 минут), оно останется в списке процессов. Даже когда я спрашиваю, что такое "состояние" процесс имеет (proc-> gp; kp_proc.p_stat), он возвращает «выполняется».

Мой вопрос: кто-нибудь знает метод определения того, какой PID в настоящее время работает / активно используется (может быть: увеличение времени процессора? Время работы? Такты процессора и т. Д.) ??

Ответы на вопрос(1)

Ваш ответ на вопрос