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”)。

相關內容