我需要获取有关在 Mac OSX 上运行进程的一些信息(PID、UID、GID、进程名称)。我试过proc_pidinfo
。对于我自己的流程来说,它工作得很好。但是,对于其他用户拥有的进程,则返回 0。没有关于此功能的文档,但根据网上找到的资料 http://vinceyuan.github.io/wrong-info-from-procpidinfo/,它应该返回写入提供的缓冲区的字节数。在其他用户进程上调用此函数将返回 0,这意味着未提供任何信息。
Example:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <libproc.h>
int main(int argc, char *argv[])
{
pid_t pid;
struct proc_bsdinfo proc;
if (argc == 2)
pid = atoi(argv[1]);
else
pid = getpid();
int st = proc_pidinfo(pid, PROC_PIDTBSDINFO, 0,
&proc, PROC_PIDTBSDINFO_SIZE);
if (st != PROC_PIDTBSDINFO_SIZE) {
fprintf(stderr, "Cannot get process info");
return 1;
}
printf(" pid: %d\n", (int)proc.pbi_pid);
printf("ppid: %d\n", (int)proc.pbi_ppid);
printf("comm: %s\n", proc.pbi_comm);
printf("name: %s\n", proc.pbi_name);
printf(" uid: %d\n", (int)proc.pbi_uid);
printf(" gid: %d\n", (int)proc.pbi_gid);
return 0;
}
运行这个程序会产生:
$ ./pidinfo
pid: 30519
ppid: 8434
comm: pidinfo
name: pidinfo
uid: 501
gid: 20
$ ./pidinfo 1
Cannot get process info
$ sudo ./pidinfo 1
pid: 1
ppid: 0
comm: launchd
name: launchd
uid: 0
gid: 0
这很奇怪,因为我可以从ps(1)
。但后来我检查了两者ps
and top
OSX 上是 SUID 二进制文件,这符合proc_pidinfo
行为:
$ ls -l `which ps` `which top`
-rwsr-xr-x 1 root wheel 51008 5 maj 08:06 /bin/ps
-r-sr-xr-x 1 root wheel 87952 5 maj 08:05 /usr/bin/top
但是,活动监视器无需 SUID 即可工作。
所以,我的问题是,为什么proc_pidinfo
仅提供有关我自己的流程的信息?我可以让它提供有关其他流程的信息吗?如果没有,我如何在不解析的情况下获取这些信息ps(1)
output?