如何使用UNIX-C / C ++列出所有正在运行的进程

时间:2011-01-30 10:05:10

标签: linux unix

我想列出系统中的所有进程。我曾经使用shell命令“ps”和系统函数来获得结果。但是,它似乎有点复杂。如何使用UNIX C函数来完成这项工作。

7 个答案:

答案 0 :(得分:2)

在Linux下,您可以检查伪文件系统/proc以获取进程信息。这意味着使用opendir()函数集并查找作为数字的子目录 - 这些是系统上运行的每个进程的进程标识符。每个子目录中都有许多文件,只要您的进程具有所需的权限,就可以使用open()/read()打开和读取这些文件。

参见

  

PROC(5)

联机帮助页,了解您可以获得的更多详细信息。

答案 1 :(得分:1)

有一个完成解决方案。

请参阅https://sourceforge.net/p/readproc/code/ci/master/tree/

使用git克隆它并执行您想要的操作。

#include"read_proc.h"
int main(void)
{
   struct Root * root=read_proc();
   struct Job * buffer;
   int i=0;
   for(;i<root->len;i++)
   {
       buffer=get_from_place(root,i);
       printf("%s\t%u\n",buffer->name,buffer->pid);
   }
   return 0;
}

答案 2 :(得分:1)

ps is the standard,无论好坏。它有许多不受重视的格式化选项,可以简化您的输出的跨平台解析。

/proc更方便,但不可移植,即使在支持的情况下也可能在本地不可用(例如,在 chroot 环境中)。

答案 3 :(得分:0)

您只需要列出/proc/目录=)我的question可能对您有所帮助。

答案 4 :(得分:0)

没有找到过程信息的标准;每个Unix供应商都可以提供自己的机制来向系统管理员提供信息。

Linux和Solaris使用/proc/文件系统将进程信息导出到用户空间,但我不认为它们完全兼容。 (我有一个模糊的回忆,Solaris决定以二进制格式导出所有信息以删除内核中的处理,代价是将用户空间程序与内核数据结构更紧密地联系在一起。top程序曾经非常好在窥视内核内存以读取进程表时,我不确定它是否需要更多,但也许所有的历史知识仍然存在。)

如果您想要特定于平台,则Linux proc(5)联机帮助页具有您需要的信息。快乐的黑客。 :)

答案 5 :(得分:0)

在ps的手册页中,我读到您可以使用ps -e列出标准格式的所有进程,并使用ps ax列出BSD格式的所有进程。

希望有所帮助。

答案 6 :(得分:0)

在绝对鼓励您从C / C ++程序浏览伪/proc文件系统的同时,您应该使用proc/readproc.h一部分的libprocps并能够访问相同的信息。

例如在基于Debian的发行版上,您需要安装libprocps-dev

apt install libprocps-dev

您可以通过这种方式列出您的进程,有关可用标志的信息,请参见man openproc

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <proc/readproc.h>

using std::cout;

int main()
{
  PROCTAB* proc = openproc(PROC_FILLMEM | PROC_FILLSTAT | PROC_FILLSTATUS);

  proc_t proc_info;
  memset(&proc_info, 0, sizeof(proc_info));
  cout << "Program\tPID\tPPID\tMEM\tutime\tstime\n";
  while (readproc(proc, &proc_info) != NULL) {
      cout << proc_info.cmd << "\t" << proc_info.tid;
      cout << proc_info.ppid << "\t" << proc_info.resident;
      cout << proc_info.utime << "\t" << proc_info.stime << "\n";
  }

  closeproc(proc);

  return 0;
}

并进行编译:

g++ -g -Wall -O2 readps.cc -o readps -lprocps