Humanity

Edit the world by your favorite way

/procや/dev

※man procについての詳細を見たい人はこちら。


自分は/proc以下のファイルについてまったく何も(それがHDDの容量を取らないということぐらいしか)知らなかったんだけど、man procすると結構面白いことが分かった。
まず、/proc以下にやたらある数字のディレクトリは、そのpidを持つプロセスについての情報を持つディレクトリであるということ。
そのディレクトリはそれぞれ次のようなファイルを持つ。
以下面白そうなのだけ抜粋。

/proc/[pid]/cmdline
プロセスの完全なコマンド行を保持する。 ただし、そのプロセスがゾンビプロセスの場合は、このファイルは空となる。 つまり、このファイルを読み出しても一文字も返らない。 このファイルではコマンドライン引き数が、 ヌル文字で区切られた文字列として書かれており、 最後の文字列の後にヌルバイト (aq\0aq) が一つ置かれる。

/proc/[pid]/cwd
プロセスのカレントワーキングディレクトリへのシンボリックリンク。 例えば、プロセス 20 のカレントワーキングディレクトリを見つけるためには、 次のようにすればよい。

$ cd /proc/20/cwd; /bin/pwd

pwd コマンドはシェルの内部コマンドのことがよくあり、 うまく動作しないかもしれない。 bash(1) では pwd -P を使ってもよい。

マルチスレッドプロセスでは、メインスレッドがすでに終了している場合、 このシンボリックリンクの内容は参照できない (スレッドの終了は通常 pthread_exit(3) を呼び出しにより行われる)。

/proc/[pid]/environ
このファイルはプロセスの環境変数を含んでいる。 各エントリは NULL バイト (aq\0aq) で区切られていて、 末尾に NULL バイトがあるかもしれない。 したがって、プロセス 1 の環境変数を表示するためには 次のようにすればよい。


$ (cat /proc/1/environ; echo) | tr aq\000aq aq\naq

/proc/[pid]/exe
Linux 2.2 以降では、このファイルはシンボリックリンクで、 実行可能コマンドの実際のパス名を格納している。 このシンボリックリンクは通常のように辿ることができる; これをオープンすると実行可能ファイルがオープンされる。 (コマンドラインで) /proc/[pid]/exe と入力すると、プロセス番号 [pid] で実行されている 実行可能ファイルをもう一つ実行することができる。 マルチスレッドプロセスでは、メインスレッドがすでに終了している場合、 このシンボリックリンクの内容は参照できない (スレッドの終了は通常 pthread_exit(3) を呼び出しにより行われる)。

Linux 2.0 以前では、 /proc/[pid]/exe は実行されたバイナリへのポインタで、シンボリックリンクのように見える。 Linux 2.0 以前では、このファイルに対して readlink(2) を実行すると、


[デバイス番号]:iノード番号

というフォーマットの文字列が返る。

たとえば、[0301]:1502 はメジャーデバイス番号 03 (IDE, MFM などのドライブ) マイナーデバイス番号 01 (最初のドライブの最初のパーティション) の デバイス上の iノード番号 1502 である。

-inum オプションをつけて find(1) を使うと、このファイルの所在を探すことができる。

これだけでもなんかできそうだ。
あと/dev/pts/以下のファイルも面白い。
これとか正にハックって感じがする。