让task_for_pid()在El Capitan

时间:2015-12-26 05:03:36

标签: macos osx-elcapitan

多年前,我们编写了一个需要监视多个进程的资源使用情况的应用程序。这是在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编译的。

0 个答案:

没有答案