首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OSX:对于其他用户的进程,proc_pidinfo返回0

OSX:对于其他用户的进程,proc_pidinfo返回0
EN

Stack Overflow用户
提问于 2016-05-30 00:48:08
回答 2查看 3.6K关注 0票数 5

我需要获取有关在Mac上运行的进程的一些信息(PID、UID、GID、进程名)。我试过proc_pidinfo了。对于我自己的进程,它工作得很好。但是,对于其他用户拥有的进程,返回0。没有关于这个函数的文档,但是根据information found on Internet的说法,它应该返回写入到提供的缓冲区中的字节数。在其他用户的进程上调用此函数将返回0,这意味着没有提供任何信息。

示例:

代码语言:javascript
运行
复制
#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;
}

运行此程序会产生以下结果:

代码语言:javascript
运行
复制
 $ ./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)获得所有这些信息。但随后我检查了OSX上的pstop都是SUID二进制文件,这符合proc_pidinfo行为:

代码语言:javascript
运行
复制
 $ 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

但是,Activity Monitor在没有SUID的情况下也能工作。

所以,我的问题是,为什么proc_pidinfo只提供关于我自己的进程的信息?我可以让它给我关于其他进程的信息吗?如果没有,我如何才能在不解析ps(1)输出的情况下获得此信息?

EN

回答 2

Stack Overflow用户

发布于 2016-10-03 13:09:57

您可以使用:

代码语言:javascript
运行
复制
int proc_listpids(uint32_t type, uint32_t typeinfo, void *buffer, int buffersize);

结合到proc_pidinfo,以获得许多其他pids信息,如:

代码语言:javascript
运行
复制
#include <unistd.h>
#include <stdlib.h>
#include <mach/mach.h>
#include <libproc.h>
#include <mach/mach_time.h>
#include <sys/sysctl.h>
#include <mach-o/ldsyms.h>
#include <stdio.h>

void procpid(pid_t pid)
{ struct proc_bsdinfo proc;
  int st = proc_pidinfo(pid, PROC_PIDTBSDINFO, 0, &proc, PROC_PIDTBSDINFO_SIZE);
  printf("name: %s\n", proc.pbi_name);
}

void pidlist(void)
{ int bufsize = proc_listpids(PROC_ALL_PIDS, 0, NULL, 0);
  pid_t pids[2 * bufsize / sizeof(pid_t)];
  bufsize = proc_listpids(PROC_ALL_PIDS, 0, pids, sizeof(pids));
  size_t num_pids = bufsize / sizeof(pid_t);
  int i = 0;
  while (i < num_pids)
  { printf("pid[%d]::%d\n", i, pids[i]);
    procpid(pids[i]);
    printf("\n-------------------------------\n\n");
    i += 1; }}

int main(void)
{ pidlist();
  return(42); }
票数 5
EN

Stack Overflow用户

发布于 2019-07-14 13:13:32

我发现macOS Mojave (版本10.14.4)有struct proc_bsdshortinfo,它是struct proc_bsdinfo的一个子集。您可以在没有SUID的情况下使用SUID而不是struct proc_bsdinfo来获取其他用户的进程。

嗯,我不知道它是从哪个版本获得的。

编辑:它至少从macOS 10.10.5 (约塞米蒂)开始可用。

再次编辑:它可能从MacOSX10.7 (Lion)开始可用,因为如果定义了__MAC_10_7,则tmux使用struct proc_bsdshortinfo。参见here

示例:

代码语言:javascript
运行
复制
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <libproc.h>

int main(int argc, char *argv[])
{
    pid_t pid;
    struct proc_bsdshortinfo proc;

    if (argc == 2)
        pid = atoi(argv[1]);
    else
        pid = getpid();

    int st = proc_pidinfo(pid, PROC_PIDT_SHORTBSDINFO, 0,
                         &proc, PROC_PIDT_SHORTBSDINFO_SIZE);

    if (st != PROC_PIDT_SHORTBSDINFO_SIZE) {
        fprintf(stderr, "Cannot get process info\n");
        return 1;
    }
    printf(" pid: %d\n", (int)proc.pbsi_pid);
    printf("ppid: %d\n", (int)proc.pbsi_ppid);
    printf("comm: %s\n",      proc.pbsi_comm);
    //printf("name: %s\n",      proc.pbsi_name);
    printf(" uid: %d\n", (int)proc.pbsi_uid);
    printf(" gid: %d\n", (int)proc.pbsi_gid);

    return 0;
}

此程序打印:

代码语言:javascript
运行
复制
$ ./pidinfo 
 pid: 3025
ppid: 250
comm: pidinfo
 uid: 501
 gid: 20
$ ./pidinfo 1
 pid: 1
ppid: 0
comm: launchd
 uid: 0
 gid: 0
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37512486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档