mac 得到進程信息的方法

NSProcessInfo能夠得到當前進程的信息。得到全部活動進程信息能夠嘗試使用下面的方法。 linux

進程的信息能夠經過ps命令獲得也能夠經過sysctl方法獲得。 可是我老是不能獲取進程的流量信息,關於這一點很糾結,如今的想法就是若是可以獲取進程的網絡端口,而後對端口進行監聽,統計其流量,可是如何可以獲取進程的網絡端口? 在linux中能夠經過netstat命令來查詢進程和其對應的端口,可是在macos中netstat命令和linux中不一樣,並不能實現這一功能(我沒找到,希望是可以的)。 因爲本人學習objective-c不久,不知道是否有這樣的api,若是你有什麼好的方法能夠和我聯繫。 如下是兩種方法的代碼:objective-c

- (void)processListWithPS
{
    _procList = [[NSMutableArray alloc] init];
 
    FILE *fp = popen("ps -eo start,user,pid,pcpu,vsz,rss,etime,utime,stime,msgsnd,msgrcv", "r"); 
    if (fp)
    { 
        char line[4096] = {0}; 
        int row = 0;
        while (line == fgets(line, 4096, fp))
        { 
            row++;
            if (row > 1)
            { 
                NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 
                char start[20];        //進程開始時間
                char user[50];        //擁有進程用戶名
                char pid[10];        //進程id
                char cpu[10];        //進程佔用cpu率
                char vsz[10];        //vss,虛擬內存
                char rss[10];        //rss,物理內存
                char etime[20];        //進程持續時間
                char utime[20];        //用戶佔用進程時間
                char stime[20];        //系統佔用進程時間
 
                sscanf(line, "%s %s %s %s %s %s %s %s %s",
                       start, user, pid, cpu, vsz, rss, etime, utime, stime); 
 
                NSString *procStart = [NSString stringWithFormat:@"%s", start];
                NSString *procUser = [NSString stringWithFormat:@"%s", user];
                NSString *procPid = [NSString stringWithFormat:@"%s", pid];
                NSString *procCpu = [NSString stringWithFormat:@"%s", cpu];
                NSString *procVss = [NSString stringWithFormat:@"%s", vsz];
                NSString *procRss = [NSString stringWithFormat:@"%s", rss];
                NSString *procETime = [NSString stringWithFormat:@"%s", etime];
                NSString *procUtime = [NSString stringWithFormat:@"%s", utime];
                NSString *procStime = [NSString stringWithFormat:@"%s", stime];
 
                ProcessInfo *proc = [[ProcessInfo alloc] init];                
                proc.startTime = procStart;
                proc.user = procUser;
                proc.procID = procPid;
                proc.cpuRate = [procCpu floatValue];
                proc.vss = [procVss integerValue];
                proc.rss = [procRss integerValue];
                proc.usedTime = procETime;
                proc.utime = procUtime;
                proc.stime = procStime;
                proc.upFlow = [procMsgsnd integerValue];
                proc.downFlow = [procMsgrcv integerValue];
 
                [_procList addObject:proc];
                [pool release];
            } 
        }
        pclose(fp); 
    } 
}
 
 
//返回全部正在運行的進程的 id,name,佔用cpu,運行時間
//使用函數int	sysctl(int *, u_int, void *, size_t *, void *, size_t)
- (NSArray *)runningProcesses 
{
    //指定名字參數,按照順序第一個元素指定本請求定向到內核的哪一個子系統,第二個及其後元素依次細化指定該系統的某個部分。
    //CTL_KERN,KERN_PROC,KERN_PROC_ALL 正在運行的全部進程
    int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL ,0};
 
 
    size_t miblen = 4;
    //值-結果參數:函數被調用時,size指向的值指定該緩衝區的大小;函數返回時,該值給出內核存放在該緩衝區中的數據量
    //若是這個緩衝不夠大,函數就返回ENOMEM錯誤
    size_t size;
    //返回0,成功;返回-1,失敗
    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);
                process = NULL;
            }
            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)
        {
            int nprocess = size / sizeof(struct kinfo_proc);
            if (nprocess)
            {                
                NSMutableArray * array = [[NSMutableArray alloc] init];
                for (int i = nprocess - 1; i >= 0; i--)
                {
                    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
                    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 * proc_CPU = [[NSString alloc] initWithFormat:@"%d", process[i].kp_proc.p_estcpu];
                    double t = [[NSDate date] timeIntervalSince1970] - process[i].kp_proc.p_un.__p_starttime.tv_sec;
                    NSString * proc_useTiem = [[NSString alloc] initWithFormat:@"%f",t];
 
                    //NSLog(@"process.kp_proc.p_stat = %c",process.kp_proc.p_stat);
 
                    NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];
                    [dic setValue:processID forKey:@"ProcessID"];
                    [dic setValue:processName forKey:@"ProcessName"];
                    [dic setValue:proc_CPU forKey:@"ProcessCPU"];
                    [dic setValue:proc_useTiem forKey:@"ProcessUseTime"];
 
                    [processID release];
                    [processName release];
                    [proc_CPU release];
                    [proc_useTiem release];
                    [array addObject:dic];
                    [dic release];
 
                    [pool release];
                }
 
                free(process);
                process = NULL;
                //NSLog(@"array = %@",array);
 
                return array;
            }
        }
    }
 
    return nil;
}
相關文章
相關標籤/搜索