为什么sysctl的生产在Mac OS X E_INVAL?
-
24-09-2019 - |
题
下面是一个削减(错误/ 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
手册页
不隶属于 StackOverflow