Подтвердить что ты не робот

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

4b9b3361

Ответ 1

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

Я использовал код из этого ответа Можем ли мы получить приложения, запущенные в настоящее время в 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];

}