我想列出系统中的所有进程。我以前使用shell命令“ps”和系统函数来得到结果。但是,这似乎有点复杂。如何使用UNIX C函数来完成这项工作。
xkrw2x1b1#
在Linux下,你可以检查伪文件系统/proc中的进程信息,这意味着使用opendir()的函数集并查找数字子目录--这些是系统上运行的每个进程的进程标识符,每个子目录中有许多文件。只要您的进程具有所需的权限,就可以使用open()/read()打开和读取该文件。请参阅过程(5)手册页,以获取可用信息的更多详细信息。
/proc
opendir()
open()/read()
qzlgjiam2#
虽然我们强烈建议您浏览伪/proc文件系统,但是在C/C++程序中,您应该使用proc/readproc.h,它是libprocps的一部分,并且能够访问相同的信息。例如,在基于Debian的发行版上,您需要安装libprocps-dev:
proc/readproc.h
libprocps
libprocps-dev
apt install libprocps-dev
你可以这样列出你的进程,参见man openproc了解可用的标志:
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
siotufzp3#
/proc更方便,但不可移植,并且即使在支持的地方(例如,在 chroot 环境中)也可能在本地不可用。
olmpazwi4#
对此有一个最终解决方案。参见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; }
cx6n0qe35#
没有查找过程信息的标准;每个Unix厂商都提供他们自己的机制来向系统管理员提供信息。Linux和Solaris使用/proc/文件系统将进程信息导出到用户空间,但我认为它们根本不兼容。(我隐约记得Solaris决定以二进制格式导出其所有信息以消除内核内处理,代价是将用户空间程序更紧密地绑定到内核数据结构。top程序曾经非常擅长窥视内核内存以读取进程表,我不确定它是否需要更多,但可能所有的历史知识仍然存在。)如果你想了解特定平台,Linux proc(5)手册页有你需要的信息。
/proc/
top
proc(5)
gk7wooem6#
从ps的手册页上我读到可以使用ps -e以标准格式列出所有进程,使用ps ax以BSD格式列出所有进程。希望能有所帮助。
ps -e
ps ax
4sup72z87#
您只需要列出/proc/目录=)我的question可能会对您有所帮助。
kq0g1dla8#
#assume target running /root/eclipse_android/targetname/targetname usb 1 2 3 #here list all process and get args # #include <stdlib.h> #include <stdio.h> #include <string.h> #include <dirent.h> #include <ctype.h> static int is_Pid_Dir(const struct dirent* entry) { const char* p; for (p = entry->d_name; *p; p++) { if (!isdigit(*p)) return false; } return true; } static void List_Command() { char szProc[256]; char szFullLine[256]; char szCmd[256]; char szType[64]; int iLocationId; int iAction; int iCount; int iHit; size_t stCmdLen; char* szName; FILE* fp; DIR* dProcPath; struct dirent* entry; // Open /proc directory. dProcPath = opendir("/proc"); if (dProcPath) { // Iterate through all files and directories of /proc. while ((entry = readdir(dProcPath))) { // Skip anything that is not a PID directory. if (is_Pid_Dir(entry)) { //if want all status open /proc/<PID>/status //if want get cmdline open /proc/<PID>/cmdline snprintf(szProc, sizeof(szProc), "/proc/%s/cmdline", entry->d_name); fp = fopen(szProc, "r"); if (fp) { // Get PID, process name and number of faults. //fscanf(fp, "%s %s %*c %*d %*d %*d %*d %*d %*u %*lu %*lu %lu", &pid, &szProc, &maj_faults); memset(szFullLine, 0x00, sizeof(szFullLine)); stCmdLen = fread(szFullLine, sizeof(char), sizeof(szFullLine), fp); fclose(fp); if( stCmdLen > 0 ) { szName = strstr(szFullLine, "targetname"); if( szName ) { iHit = 0; for(iCount=0; iCount<stCmdLen-1; iCount++) { if( szFullLine[iCount] == '\x00' ) { iHit++; szFullLine[iCount] = ' '; } } //sscanf("19 cool kid", "%d %[^\n]", &iCount, szType); if( iHit >= 3 ) { sscanf(szFullLine, "%[^' '] %[^' '] %d %d", szCmd, szType, &iLocationId, &iAction); printf("%s %s %d %d\n", szCmd, szType, iLocationId, iAction); } } } } } } } closedir(dProcPath); }
也称为cpp:https://cplusplus.com/forum/unices/221977/下载https://busybox.net/downloads/提取并跟踪ps. c、procps. c内部完整API(如命令ps -ef)
8条答案
按热度按时间xkrw2x1b1#
在Linux下,你可以检查伪文件系统
/proc
中的进程信息,这意味着使用opendir()
的函数集并查找数字子目录--这些是系统上运行的每个进程的进程标识符,每个子目录中有许多文件。只要您的进程具有所需的权限,就可以使用open()/read()
打开和读取该文件。请参阅
过程(5)
手册页,以获取可用信息的更多详细信息。
qzlgjiam2#
虽然我们强烈建议您浏览伪
/proc
文件系统,但是在C/C++程序中,您应该使用proc/readproc.h
,它是libprocps
的一部分,并且能够访问相同的信息。例如,在基于Debian的发行版上,您需要安装
libprocps-dev
:你可以这样列出你的进程,参见
man openproc
了解可用的标志:并编译它:
siotufzp3#
/proc
更方便,但不可移植,并且即使在支持的地方(例如,在 chroot 环境中)也可能在本地不可用。olmpazwi4#
对此有一个最终解决方案。
参见https://sourceforge.net/p/readproc/code/ci/master/tree/
使用git克隆它,然后做你想做的。
cx6n0qe35#
没有查找过程信息的标准;每个Unix厂商都提供他们自己的机制来向系统管理员提供信息。
Linux和Solaris使用
/proc/
文件系统将进程信息导出到用户空间,但我认为它们根本不兼容。(我隐约记得Solaris决定以二进制格式导出其所有信息以消除内核内处理,代价是将用户空间程序更紧密地绑定到内核数据结构。top
程序曾经非常擅长窥视内核内存以读取进程表,我不确定它是否需要更多,但可能所有的历史知识仍然存在。)如果你想了解特定平台,Linux
proc(5)
手册页有你需要的信息。gk7wooem6#
从ps的手册页上我读到可以使用
ps -e
以标准格式列出所有进程,使用ps ax
以BSD格式列出所有进程。希望能有所帮助。
4sup72z87#
您只需要列出
/proc/
目录=)我的question可能会对您有所帮助。kq0g1dla8#
也称为cpp:https://cplusplus.com/forum/unices/221977/
下载https://busybox.net/downloads/
提取并跟踪ps. c、procps. c内部完整API(如命令ps -ef)