多年前,我们编写了一个需要监视多个进程的资源使用情况的应用程序。这是在Snow Leopard的时代。命令行命令ps
已经绰绰有余了,所以我们得到了ps
源代码的副本,并找出了它们调用的函数和原因,然后使用了类似的调用ps
作为我们项目的基础,但我们的文章是用目标C编写的,而不是C.这不是ps
副本,我们只是根据ps
如何得到的代码建模。信息的核心。从雪豹到优胜美地,这种情况很好。
输入El Capitan和无根模式。什么工作不再有效。最初我们吹了这个,因为我们正在研究El Capitan的beta版本,甚至ps
本身也表现出类似的行为。随着时间的推移,ps
开始在El Capitan下工作,但不是我们的代码。
当我们运行我们的应用程序时,它可以提供通用信息,例如进程名称和所有进程上的pid,但是对于用户实际上并不“拥有”内存和CPU使用的任何进程,它会报告所有内容的零。它似乎正确地报告了用户自己拥有/启动的进程。
查看日志文件时,横行错误的类型如下:
系统策略:拒绝(1)mach-priv-task-port
以上显示在El Capitan 10.11.2上。以前版本的操作系统表明task_for_pid
存在问题"不允许"或类似的东西(我现在没有方便的旧日志文件)。
查看较新的ps
源代码,我发现以下.plist文件现在是开发工具包的一部分。这不是多年前的代码:
http://www.opensource.apple.com/source/adv_cmds/adv_cmds-163/ps/entitlements.plist
以下是El Capitan中ps
代码的链接,供感兴趣的人使用:
http://www.opensource.apple.com/source/adv_cmds/adv_cmds-163/ps/
我的问题非常简单,我需要做些什么才能让系统再次使用task_for_pid()
,或者更好的是,更好的方法是从内核获取此信息而不会遇到无根模式问题。 FYI如果无根被禁用,我们当前应用程序中的所有内容都运行正常。通过该plist文件的外观,它们看起来像是在签署它并允许访问该功能,但这只是一个"仅限苹果"津贴?
FWIW我们的原始代码是使用带有旧式make文件的gcc编译的。