【问题标题】:How to list all the running processes by using UNIX-C/C++如何使用 UNIX-C/C++ 列出所有正在运行的进程
【发布时间】:2011-01-30 10:05:09
【问题描述】:

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

【问题讨论】:

    标签: linux unix


    【解决方案1】:

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

    查看

    proc(5)

    manpage 以获取有关您可用信息的更多详细信息。

    【讨论】:

      【解决方案2】:

      虽然我们绝对鼓励您浏览伪 /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
      

      【讨论】:

        【解决方案3】:

        ps is the standard,无论好坏。它有许多被低估的格式化选项,可以简化您对其输出的跨平台解析。

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

        【讨论】:

          【解决方案4】:

          有一个解决方案。

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

          【讨论】:

          • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
          • sourceforge 服务器当前已关闭。
          【解决方案5】:

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

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

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

          【讨论】:

          • 另外,如果 BSD 系统使用了简化的或不同的 procfs 布局的话。这包括 MacOS née Darwin。
          【解决方案6】:

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

          希望对您有所帮助。

          【讨论】:

            【解决方案7】:

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

            【讨论】:

            • 在 Unix 上没有 文件夹 这样的东西。
            • @tchrist,请说得更具体一些
            • Unix 有目录,而不是文件夹。文件夹听起来像是在和我们说话。
            • @shybovycha。无论如何,tchrist 是错的。在 Unix 中也没有目录 - 只有文件。
            猜你喜欢
            • 2021-06-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-12-08
            • 1970-01-01
            • 2021-12-21
            • 2013-05-21
            相关资源
            最近更新 更多