web-dev-qa-db-ja.com

psコマンドはどのように機能しますか?

割り当てについては、独自のバージョンのpsコマンドを実装する必要がありますが、どこから情報を取得するのかわかりません。すべてのプロセス情報はどこにありますか?

6
Muhammad Ilyas

Linuxでは、psコマンドは proc filesystem 内のファイルを読み取ることで機能します。ディレクトリ/proc/PIDには、プロセスに関する情報を提供するさまざまなファイルが含まれています[〜#〜] pid [〜#〜]。これらのファイルの内容は、プロセスがファイルを読み取るときにカーネルによってオンザフライで生成されます。

エントリに関するドキュメントは、/procproc(5)man page および kernel documentation にあります。

これは、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
…

/procフォルダーを確認することをお勧めします。
ここには、マシンで実行されているすべてのプロセスにサブフォルダーがあり、ファイルがたくさんあります(最も有用なIMOはcommで、プロセスの名前を示します)。

4
joH1

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など)をすでに数値形式で保持します。ソースをダウンロードした場合、proc_t構造体がreadproc.hに定義されています

[〜#〜] options [〜#〜] openproc()呼び出しで使用できるのはビット単位のORフラグなので、次のように1つ以上を使用できます。

    PROCTAB *proctab = openproc(PROC_FILLMEM | PROC_FILLCOM) ;

これらもreadproc.hに定義されています( '#define PROC_FILLMEM'を検索してください)。

3
João Monteiro