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