下面是一个削减(错误/ null检查省略)片断的C /的OBJ-C代码,使用的sysctl,获取特定过程的用的argv PID 50。

...
int getProcessArgs[3] = { CTL_KERN, KERN_PROCARGS, 50 };
sysctl(getProcessArgs, 3, NULL, &length, NULL, 0);
char* processArgs = malloc(length * sizeof(char));
sysctl(getProcessArgs, 3, processArgs, &length, NULL, 0);
...

要的sysctl第一呼叫(确定的argv串数组的大小)成功。返回的长度为〜1600,大于我所期望的,但我想也不无道理。 malloc的成功。第二次调用的sysctl返回-1,设置errno为22,E_INVAL。

我看其他代码,包括来自这个问题,但不能看到我的问题。我缺少什么?

有帮助吗?

解决方案

我试过包装你的代码成一个程序,它工作正常,并打印出其他进程的argv的等询问有关我自己的过程之一,当,即一个具有相同uid过程调用sysctl()

在“大于我期望”方面是因为该方法的环境变量返回以及命令行参数。 (这不是什么明显的所有这些信息的格式。)

在询问一个的不同的的用户的过程中,我从第二sysctl得到同样的EINVAL,你已经看到。我想这被认为是其他人的过程不合理的好奇心,但你会觉得第一sysctl将失败了。

(当询问有关不存在的PID,第一sysctl失败EINVAL。)

这一切似乎是大量未公开:在Leopard,KERN_PROCARGS甚至没有出现在sysctl手册页

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top