OS X 下在代码中枚举所有进程的方法

Reference:
如何枚举所有进程
用NSTask执行外部命令并获取输出结果的方法

在OS X开发中,有时候需要枚举所有的进程以查询某些你需要查询的进程,比如协作进程之类,或者是了解某些进程的状态。但是貌似并没有直接简单的获取这些信息的method,所以需要使用别的方法

GetNextProcess

这里使用的这套应该是来自于Core Foundation的方法,几个相关的函数如下:

OSErr GetNextProcess(ProcessSerialNumber *PSN);CFDictionaryRef ProcessInformationCopyDictionary(               const ProcessSerialNumber  *PSN,               UInt32                      infoToReturn);

但很棘手的是以上两个方法在OS X 10.9之后都是“deprecated”状态了,按照Apple一贯的尿性,不知道什么时候升级了Xcode就不支持了……

首先从第二个函数中可以获得很多信息,比如可以直接调用一下的例子来列举所有的process:

ProcessSerialNumbber psn = {0, kNoProcess};OSErr callStat;while(noErr == (callStat = GetNextProcess(&psn))){    NSDictionary *dict = (__bridge NSDictionary*)                            ProcessInformationCopyDictionary(                                        &psn,                                        kProcessDictionaryIncludeAllInformationMask);    NSNumber *pidNumber = (NSNumber*)[dict objectForKey:@"pid"];    /* 这一步获得了pid之后就可以做很多事了 */    ......}

得到的dictionary还有很多成员,可以参照“Core Foundation Keys”,也可以在调用的时候NSLog()出来查看

NSTask

前一个方法只能解决查看普通进程的功能,无法看到很多后台进程或者是系统级进程。这个时候自然想到一些shell命令了。
在OS X中要使用NSTask来启动shell命令,然后重定向输出。下午女列出读取shell输出到一个NSString对象的例子,可以直接复制粘贴使用:

  • (NSString)runShellCommand:(NSString)path
    arguments:(NSArray)arguments
    {
    NSTask
    task;
    NSPipe pipe;
    NSFileHandle
    file;
    NSData *dataRead;

    task = [[NSTask alloc] init];
    [task setLaunchPath: path];
    [task setArguments: arguments];

    pipe = [NSPipe pipe];
    [task setStandardOutput: pipe];

    file = [pipe fileHandlForReading];

    [task launch];
    [task waitUntilExit];

    dataRead = [file readDataToEndOfFile];
    return [[NSString alloc] initWithData: dataRead
    encoding: NSUTF8StringEncoding];
    }
    调用方法如下:

NSString *psResult = [self runShellCommand: @"/bin/ps"
arguments:[NSArray arrayWithObjects: @"-A", nil]];

关键字:macos, xcode

版权声明

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部