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


person hackerdiehack    schedule 07.09.2012    source источник
comment
Во-первых, у меня к вам вопрос. Когда значение p_stat равно 2, означает ли это, что этот процесс запущен? Когда я запускаю симулятор, я обнаружил, что некоторые процессы имеют значение p_stat, равное 5. Кроме того, я обнаружил, что все значения тика или времени процессора равны 0. Кажется, что эти значения никогда не статируются в Дарвине. Я не знаю, так ли это в бесплатной BSD.   -  person HChen    schedule 12.10.2012
comment
Неа. Значения, похоже, нигде не меняются... поэтому пока нет признаков запущенного процесса из sysctl.   -  person hackerdiehack    schedule 17.10.2012
comment
@hackerdiehack Знаете ли вы, как определить, когда процесс находится на переднем плане или в фоновом режиме?   -  person James Laurenstin    schedule 10.01.2014
comment
@JamesLaurenstin Мне также интересно это узнать, если вы когда-нибудь это поймете.   -  person airpaulg    schedule 21.01.2014
comment
Я не думаю, что это вообще возможно. Я провел так много исследований на эту тему. Единственный способ, который я могу придумать, - это злоупотребление недокументированным API SpringBoard.   -  person hackerdiehack    schedule 23.01.2014
comment
как мы можем рассчитать память, используемую процессом?   -  person Amit Khandelwal    schedule 10.08.2015
comment
@hackerdiehack, у вас есть какая-нибудь информация/ссылки на частные API для запроса трамплина? Частные API подходят для моего приложения (не из магазина приложений).   -  person Duncan C    schedule 03.09.2015


Ответы (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];

}
person Peteee24    schedule 12.04.2013
comment
у меня это не работает... как это проверить? Я пробовал следующее: kp_proc.p_flag == 18432 - person hackerdiehack; 23.05.2013
comment
к сожалению, это возвращает только текущее отлаживаемое приложение:/ - person hackerdiehack; 24.05.2013