Определить, какое приложение в настоящее время работает на 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-> kp_proc.p_stat), он возвращает «running».

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

    Отвечая на «текущую» часть вашего вопроса:

    Я использовал код из этого ответа. Можем ли мы получить приложения, которые в настоящее время работают на iPhone и iPad?

    Посмотрел объявления k_proc здесь: http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/bsd/sys/proc.h

    С пробной версией и ошибкой выяснилось, что процессы с параметром p_flag, установленным в 18432, – это текущее приложение (в данном случае это тест).

    Посмотрите первую ссылку и замените внутреннюю часть цикла:

     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]; } 
    Давайте будем гением компьютера.