【发布时间】:2011-01-30 10:05:09
【问题描述】:
我想列出系统中的所有进程。我曾经使用 shell 命令“ps”和系统函数来获得结果。但是,它似乎有点复杂。如何使用 UNIX C 函数来完成这项工作。
【问题讨论】:
我想列出系统中的所有进程。我曾经使用 shell 命令“ps”和系统函数来获得结果。但是,它似乎有点复杂。如何使用 UNIX C 函数来完成这项工作。
【问题讨论】:
在 Linux 下,您可以检查伪文件系统 /proc 以获取进程信息。这意味着使用opendir() 函数集并查找数字子目录——这些是系统上运行的每个进程的进程标识符。每个子目录中有许多文件,只要您的进程具有所需的权限,就可以使用open()/read() 打开和读取这些文件。
查看
proc(5)
manpage 以获取有关您可用信息的更多详细信息。
【讨论】:
虽然我们绝对鼓励您浏览伪 /proc 文件系统,但在 C/C++ 程序中,您应该使用 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
【讨论】:
ps is the standard,无论好坏。它有许多被低估的格式化选项,可以简化您对其输出的跨平台解析。
/proc 更方便,但不可移植,即使在受支持的情况下(例如,在 chroot 环境中),也可能在本地不可用。
【讨论】:
有一个解决方案。
见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;
}
【讨论】:
没有查找流程信息的标准;每个 Unix 供应商都可以提供自己的机制来向系统管理员提供信息。
Linux 和 Solaris 使用 /proc/ 文件系统将进程信息导出到用户空间,但我认为它们根本不兼容。 (我有一个模糊的回忆,Solaris 决定以二进制格式导出其所有信息以删除内核内处理,代价是更紧密地将用户空间程序与内核数据结构联系起来。top 程序过去非常擅长窥视进入内核内存来读取进程表,我不确定它是否需要,但也许所有的历史知识仍然存在。)
如果您想要特定于平台,Linux proc(5) 联机帮助页包含您需要的信息。快乐的黑客。 :)
【讨论】:
从 ps 的手册页我读到,您可以使用 ps -e 以标准格式列出所有进程,并使用 ps ax 以 BSD 格式列出所有进程。
希望对您有所帮助。
【讨论】:
您只需要列出/proc/ 目录 =) 我的question 可能对您有所帮助。
【讨论】: