所以我使用此代码获取iOS设备上运行的所有进程的列表:
-(NSArray *) getProcesses {
int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0};
unsigned int miblen = 4;
size_t size;
int st = sysctl(mib, miblen, NULL, &size, NULL, 0);
struct kinfo_proc * process = NULL;
struct kinfo_proc * newprocess = NULL;
do {
size += size / 10;
newprocess = realloc(process, size);
if (!newprocess){
if (process){
free(process);
}
return nil;
}
process = newprocess;
st = sysctl(mib, miblen, process, &size, NULL, 0);
} while (st == -1 && errno == ENOMEM);
if (st == 0){
if (size % sizeof(struct kinfo_proc) == 0){
unsigned long nprocess = size / sizeof(struct kinfo_proc);
if (nprocess){
NSMutableArray * array = [[NSMutableArray alloc] init];
for (long i = nprocess - 1; i >= 0; i--){
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 *ppid = [NSString stringWithFormat:@"%d", process[i].kp_eproc.e_ppid];
NSDictionary * dict = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:processID, processName, ppid, nil]
forKeys:[NSArray arrayWithObjects:@"ProcessID", @"ProcessName", @"ppid", nil]];
[array addObject:dict];
}
free(process);
return array;
}
}
}
return nil;
}
我以为我能够通过父pid进行过滤,因为通常守护进程被init进程(pid 1)采用,但根据此代码的输出,包括用户应用在内的几乎所有进程都有1作为ppid。因此要么iOS没有跟踪这个,要么每个人都被抛出init(或者调用BSD等价物)。此外,我还想过抛弃任何结束于' d'像大多数守护进程一样,但那里有一个明显的问题。那么,是否有人知道如何过滤掉用户应用程序而不是系统进程?