//
//  main.m
//  process
//
//  Created by piao on 15/8/13.
//  Copyright (c) 2015年 piao. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <sys/sysctl.h>
#import <signal.h>
#import <unistd.h>


NSArray *processInfo() {
    
    int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0};
    size_t size;
    int st = sysctl(mib, sizeof(mib) / sizeof(CTL_KERN), 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, sizeof(mib) / sizeof(CTL_KERN), 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 (unsigned long i = 0; i < nprocess; i++){
                    
                    NSNumber *processID = [NSNumber numberWithInt:process[i].kp_proc.p_pid];
                    NSString *processName = [[NSString alloc] initWithFormat:@"%s", process[i].kp_proc.p_comm];
                    
                    NSDictionary * dict = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:processID, processName, nil]
                                                                        forKeys:[NSArray arrayWithObjects:@"pid", @"name", nil]];
                    [array addObject:dict];
                }
                
                free(process);
                return array;
            }
        }
    }
    
    return nil;
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"process info:%@", processInfo());
    }
    return 0;
}


你可能感兴趣的文章

评论区

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。