ps 命令如何工作?

ps 命令如何工作?

对于一项作业,我需要实现我自己的ps命令版本,但我不确定它从哪里获取信息。我在哪里可以找到所有流程信息?

答案1

在 Linux 上,该ps命令的工作原理是读取进程文件系统。该目录包含提供有关进程信息的各种文件/proc/PIDPID。当进程读取这些文件的内容时,内核会动态生成它们。

/proc您可以在中找到有关条目的文档proc(5) 手册页并在内核文档

ps您可以通过观察命令的作用来自行发现这一点strace,列出进程进行的系统调用的命令。

% strace -e open ps
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libprocps.so.3", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
open("/proc/self/stat", O_RDONLY)       = 3
open("/proc/uptime", O_RDONLY)          = 3
open("/proc/sys/kernel/pid_max", O_RDONLY) = 4
open("/proc/meminfo", O_RDONLY)         = 4
open("/proc/1/stat", O_RDONLY)          = 6
open("/proc/1/status", O_RDONLY)        = 6
open("/proc/2/stat", O_RDONLY)          = 6
open("/proc/2/status", O_RDONLY)        = 6
open("/proc/3/stat", O_RDONLY)          = 6
open("/proc/3/status", O_RDONLY)        = 6

% strace -e open ps
open("/proc/1/stat", O_RDONLY)          = 6
open("/proc/1/status", O_RDONLY)        = 6
open("/proc/1/cmdline", O_RDONLY)       = 6

答案2

您可能想查看该/proc文件夹:
您计算机上运行的每个进程在这里都有一个子文件夹,其中包含大量文件(IMO 最有用的是comm,它给出了进程的名称。)

答案3

它通过使用 libprocps.so 库来工作。

主要格式为:

(A) 启动(调用openproc())

(B) 读取进程信息(为每个进程调用 readproc())

(C) 停止(调用 closeproc())

使用 libprocps.so 有优点(例如,使您无需编写一堆“解析”函数)和缺点(也许您需要的信息比 readproc() 调用收集的信息要少)。

使用 libprocps.so 的程序具有这种基本格式。

    #include <proc/readproc.h>
         :
    int main()
   {
         :
       PROCTAB *proctab = openproc(<OPTIONS>) ;
         :
         :
       proc_t procinfo ;
       memset(&procinfo, 0, sizeof(procinfo)) ;
       while(readproc(proctab, &procinfo) != nullptr)
       {
          <do something with procinfo data>
       }
         :
         :
       closeproc(proctab) ;
       return 0 ;
    }

procinfo 将以数字格式保存进程的所有信息(如 utime、stime、priority、nice、ppid 等)。如果您下载了源代码,过程_tstruct 被定义到 readproc.h 中

选项您可以在 openproc() 调用中使用按位或标志,因此您可以使用其中的一个或多个,如下所示:

    PROCTAB *proctab = openproc(PROC_FILLMEM | PROC_FILLCOM) ;

它们也被定义到 readproc.h 中(搜索“#define PROC_FILLMEM”)。

相关内容