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

本文地址:https://segmentfault.com/a/11...


在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*)patharguments:(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: dataReadencoding: NSUTF8StringEncoding];
}

调用方法如下:

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

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

  1. 计算机 其他 无法删除吗,Ghost win7系统下删除我的电脑中其他多余图标的方法

    在ghost win7系统下打开我的电脑时,大家可以看到的一般都是磁盘.可移动存储设备等图片,但是有些用户发现在电脑上面安装了一些软件之后,就会在其他图标中多了很多软件的图标,虽然这样可以方便我们打开 ...

  2. python 结束子线程并保证工作完成_python3中在线程中结束工作进程的方法

    我想知道在python3中结束工作线程的方法.在 如果你看这个来自this question的代码示例,worker中有一个while True循环,我看到的是{}被调用了.在 为什么这个工人会自动结 ...

  3. Linux中批量杀进程的方法

    之前的文章中(Linux卸载分区时提示:device is busy 的处理方法_花生君的博客-CSDN博客)有提到批量杀进程,特此提供两种批量杀进程的解决思路. 一.使用awk批量杀进程的命令: p ...

  4. Linux系统中杀死僵尸进程的方法

    在linux系统管理中,当用ps命令观察进程的执行状态时,经常看到某些进程的状态栏为defunct,这就是所谓的"僵尸"进程."僵尸"进程是一个早已 死亡的进程 ...

  5. 当前目录下所有代码中查找

    find . -name "*.h" | xargs grep 'INCLUDE_THIS_STR' | grep 'EXCLUDE_THIS\|OR_THIS' -v 如 fin ...

  6. php 禁用 chunked,php下HTTP Response中的Chunked编码实现方法

    进行Chunked编码传输的HTTP Response会在消息头部设置: Transfer-Encoding: chunked 表示Content Body将用Chunked编码传输内容. Chunk ...

  7. android 设置静态ip,Android下用代码设置静态IP地址的方法(完美支持Android2.X,Android3.X,Android4.X)...

    有一个项目,要控制设备wifi连接,而且要使用静态ip,上网查找了下,基本都是Android2.X下面的方法,即使用Settings进行设置,但是这种设置方法对于Android3.X以上设备是无效的, ...

  8. Mac OS X 下文件名乱码出现的原因和解决方法

    在Mac电脑的使用过程中,偶尔会出现各种各样的问题,有些用户会遇到下载文件是乱码的问题,为什么会出现乱码?如何解决.下面我们分享出现乱码的原因及解决方法. 乱码原因: 缺少服务造成的 乱码: FCPX ...

  9. Windows 下在 Python 中安装 Swampy 模块的方法

    在学习 Think Python 第四章 接口设计 时, 遇到的第一个问题就是安装 Swampy 模块,参考了官方的安装方法 http://www.greenteapress.com/thinkpyt ...

最新文章

  1. oracle 9i生成分析报告,ORACLE 9i 以后的分析函数汇总 - fesing - Qihang.Net
  2. formdata传参java用对象怎么接受_Java基础4
  3. XCTF-Reverse:open-source
  4. 分享:几款代码混淆器(DotFuscator, .NET Reactor, xenocode)
  5. OpenGL绘制二个不同颜色的三角形的实例
  6. java线程和线程池的使用
  7. excel同一单元格怎么换行_Excel工作表中最经典的10个应用,小技巧,大作用
  8. komodo-edit
  9. testerhome学习笔记1_互联网测试技术
  10. 建议收藏!可视化系统五大实用的应用场景
  11. 助力自动驾驶商业化 高德公布高精地图技术路线图
  12. python假设检验--两个总体参数的检验(方差)
  13. 手机微信中对方正在输入...,不显示有4种原因,还能永不显示
  14. abp web ui 负号提前显示
  15. 十三.人脸检测和车牌识别
  16. 被用户满意度坑的经历
  17. 串口一拖二——硬件实现、软件使用
  18. html里怎么显示文章段落,html 文章段落
  19. 怎样建设一个公司网站的教程
  20. 适合摸鱼的epub阅读器

热门文章

  1. win7 设置自动关机
  2. java设计模式_状态模式
  3. web安全之信息刺探防范(上)
  4. JVM内存分配与垃圾回收浅析
  5. 微软安全管理解决方案 为企业安全保驾护航
  6. Windows实现appium+iOS自动化测试
  7. ca证书 linux 导入_CA搭建与证书申请
  8. python 对象_python面向对象
  9. python中实数怎么表示_如何用实数的模来计算pow()?
  10. GRDB使用SQLite的WAL模式