c - 为什么 sysctl 在 Mac OS X 上产生 E_INVAL?

标签 c objective-c macos sysctl

下面是一个精简的(省略了错误/空检查)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,比我预期的要大,但我认为并非不合理。 Malloc 成功。第二次调用 sysctl 返回 -1,将 errno 设置为 22,E_INVAL。

我查看了其他代码,包括 this question 中的代码,但看不到我的问题。我错过了什么?

最佳答案

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

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

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

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

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

关于c - 为什么 sysctl 在 Mac OS X 上产生 E_INVAL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2567510/

相关文章:

c - 字符数组到链表 - 使用数组中的地址

c - 是否有 unix crypt(3) 函数的 OpenCL 实现?

c - typedef 和变量名

objective-c - 在 UIViewController 的 prepareForSegue 中访问属性

java - 如何恢复 Mac 中使用 java 中的 File.delete() 方法删除的文件

c - 程序未检测 if 语句

iphone - 将UITableView变成UIImageView

ios - 按下按钮后将 UIPicker 设置为像老虎机一样运行

python - 从 Sublime Text 运行 Python 3 时出错,在 IDLE 中工作

java - 如何在 Linux、Mac 和 Windows 上制作安装程序?