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

2nbm6dog  于 2023-03-12  发布在  Unix
关注(0)|答案(8)|浏览(199)

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

xkrw2x1b

xkrw2x1b1#

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

qzlgjiam

qzlgjiam2#

虽然我们强烈建议您浏览伪/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
siotufzp

siotufzp3#

  • ps* is the standard,不管是好是坏,它有许多未被重视的格式化选项,可以简化跨平台解析其输出。

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

olmpazwi

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;
}
cx6n0qe3

cx6n0qe35#

没有查找过程信息的标准;每个Unix厂商都提供他们自己的机制来向系统管理员提供信息。
Linux和Solaris使用/proc/文件系统将进程信息导出到用户空间,但我认为它们根本不兼容。(我隐约记得Solaris决定以二进制格式导出其所有信息以消除内核内处理,代价是将用户空间程序更紧密地绑定到内核数据结构。top程序曾经非常擅长窥视内核内存以读取进程表,我不确定它是否需要更多,但可能所有的历史知识仍然存在。)
如果你想了解特定平台,Linux proc(5)手册页有你需要的信息。

gk7wooem

gk7wooem6#

从ps的手册页上我读到可以使用ps -e以标准格式列出所有进程,使用ps ax以BSD格式列出所有进程。
希望能有所帮助。

4sup72z8

4sup72z87#

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

kq0g1dla

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)

相关问题