iOS过滤用户应用程序与守护进程和系统进程

时间:2014-10-28 14:13:59

标签: ios process pid

所以我使用此代码获取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'像大多数守护进程一样,但那里有一个明显的问题。那么,是否有人知道如何过滤掉用户应用程序而不是系统进程?

0 个答案:

没有答案