GNU/Linux >> Linux の 問題 >  >> Linux

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

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

/proc でエントリに関するドキュメントを見つけることができます proc(5) の man ページとカーネルのドキュメントに記載されています。

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 です) 、プロセスの名前を与えます。)


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 に定義されています

オプション openproc() 呼び出しで使用できるのはビットごとの OR フラグであるため、次のように 1 つまたは複数を使用できます。

    PROCTAB *proctab = openproc(PROC_FILLMEM | PROC_FILLCOM) ;

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


Linux
  1. Linuxgrepコマンドの使用方法

  2. Linuxでhistoryコマンドを使用する方法

  3. basenameコマンドの使用方法は?

  1. スティッキービットはどのように機能しますか?

  2. .bashrcの目的とそれはどのように機能しますか?

  3. Bashスクリプトでは、Continueコマンドは埋め込みループでどのように機能しますか?

  1. Ssh – Tcp-keepaliveはSshでどのように機能しますか?

  2. UnixターミナルでExitコマンドはどのように機能しますか?

  3. ティーコマンドはどのように機能しますか?