Определите, какое приложение в настоящее время работает на 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), он возвращает "выполняется".
Мой вопрос: кто-нибудь знает метод определения того, какой PID в настоящее время работает / активно используется (может быть: увеличение времени процессора? Время работы? Такты процессора и т. Д.)??
1 ответ
Отвечая на текущую часть вашего вопроса:
Я использовал код из этого ответа. Можем ли мы получить приложения, работающие в настоящее время на iPhone и iPad?
Посмотрел объявления k_proc здесь: http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/bsd/sys/proc.h
Методом проб и ошибок выяснилось, что процессы с p_flag, установленным в 18432, являются в настоящий момент запущенным приложением (в данном случае это тест).
Посмотрите первую ссылку и замените внутреннюю часть цикла for на:
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];
}