
課題を実行するには、独自のコマンドバージョンを実装する必要がありますがps
、情報をどこから取得するのかわかりません。すべてのプロセス情報はどこにありますか?
答え1
Linuxでは、このps
コマンドは次のように動作します。プロセスファイルシステム。このディレクトリには、プロセスに関する情報を提供するさまざまなファイルが含まれています。/proc/PID
PID。プロセスがこれらのファイルの内容を読み取ると、カーネルはそれを動的に生成します。
/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、優先順位、nice、ppidなど)をデジタル形式で保存します。ソースコードをダウンロードした場合、process_t構造体は readproc.h で定義されています。
これオプションopenproc() 呼び出しでビット OR フラグを使用できるため、次のように 1 つ以上を使用できます。
PROCTAB *proctab = openproc(PROC_FILLMEM | PROC_FILLCOM) ;
readproc.h にも定義されています ("#define PROC_FILLMEM" 検索)。