OS X获取远程进程输入args有时会失败

时间:2015-07-23 09:03:34

标签: c++ macos ps sysctl

我想以编程方式检索远程进程输入参数, 所以我用以下方式使用了sysctl(部分代码):

int    mib[3]
mib = {CTL_KERN, KERN_ARGMAX,0,0}

size = sizeof(argmax);
if (sysctl(mib, 2, &argmax, &size, NULL, 0) == -1) {
    goto ERROR_A;
}
procargs = (char *)malloc(argmax);

mib = {CTL_KERN,KERN_PROCARGS2,pid,0}

size = (size_t)argmax;
if (sysctl(mib, 3, procargs, &size, NULL, 0) == -1) {
    printf("a");
    goto ERROR_B;
}
但是,我并不适用于所有流程。 这是一个工作案例:

/System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdworker -s mdworker -c MDSImporterWorker -m com.apple.mdworker.shared

但是下面的情况在“sysctl(mib,3,procargs,& size,NULL,0)”上失败了。 虽然,我使用终端

中的'ps ax PID'成功获得了命令行
0   655   501   0 10:55AM ttys008    0:00.02 login -pfl zohar81 /bin/bash -c exec -la bash /bin/bash

也许你可以告诉我为什么在第二个例子中用KERN_PROCARGS2调用sysctl会失败?

谢谢

1 个答案:

答案 0 :(得分:1)

我发现在OS X上,当可执行文件的所有者是root并且可执行文件启用了SUID(set-uid)标志时,该进程被授予对所有进程的KERN_PROCARGS2的访问权限。唯一的例外是PID 0(kernel_task),但它甚至没有参数。

您可以使用以下方式为您的文件执行此操作:

chmod u+s myprogram
sudo chown root:wheel myprogram
# now my program should be able to make get KERN_PROCARGS2 for all processes
./myprogram