1

下面是 C/Obj-C 代码的精简(省略了错误/空检查)片段,它使用 sysctl 获取 PID 50 的特定进程的 argv。

...
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,比我预期的要大,但我认为这不是不合理的。马洛克成功了。第二次调用 sysctl 返回 -1,将 errno 设置为 22,E_INVAL。

我查看了其他代码,包括来自这个问题的代码,但看不到我的问题。我错过了什么?

4

1 回答 1

2

我尝试将您的代码包装到一个程序中,当查询我自己的一个进程时,它工作正常并打印出另一个进程的 argv 等,即一个与调用进程具有相同 uid 的进程sysctl()

“比我预期的要大”方面是因为返回了进程的环境变量以及命令行参数。(不清楚所有这些信息的格式是什么。)

当查询不同sysctl用户的进程时,我从您看到的第二个中得到相同的 EINVAL 。我想这被认为是对其他人流程的不合理的好奇,但你会认为第一个sysctl也会失败。

(当查询一个不存在的 pid 时,第一个sysctl以 EINVAL 失败。)

这一切似乎都被大量记录不足:在 Leopard 上,KERN_PROCARGS甚至没有出现在sysctl手册页中。

于 2010-04-02T19:52:19.123 回答