CentOS5(x86_64) の script コマンドを実行すると、script という名前で 2 つのプロセスが存在するのは、なんでだろうか。OSX と FreeBSD では script という名前では 1 つしか存在しないのに。
どこに情報があるかわからなかったので ftp://ftp.kernel.org/pub/linux/utils/util-linux/util-linux-2.12a.tar.gz に含まれるソース(util-linux-2.12a/misc-utils/script.c)を読んでみました。
- 親プロセスが fork() して子プロセスを生成する
- 子プロセスが fork() して孫プロセスを生成する
まず、都合 3 プロセスが生成されることがわかりました。
そのうち、孫プロセスはわかりやすく、execl でシェルを起動させていました。bash であれば、ps に出てくる名前は "bash -i" になるので、script が複数存在する件とは関係ないこともわかりました。
子プロセスは、pty のマスタから read() で読み続け、読み込んだ内容はログファイルに書き出しています。read() が 0 以下を返した場合に、読み込みのループから抜けて終了処理に移る様です。
親プロセスは、まず SIGWINCH シグナルのハンドラを登録しています。そして、標準入力から read() で読み込んだ内容を pty のマスタに書き込み続け、read() が 0 以下を返したら終了処理に移る様です。
どうやら、pty がキーワードな様子。プロセスも pty もよくわかってないわけですが、よく見れば孫プロセスがシェルを起動する際にスレーブに触っているので、シェルから書き込んだ内容を親子が使っている様な空気を感じます。
孫プロセスから流れてくるデータを子プロセスがファイルに書き込んでいるという感じでしょうか。親プロセスが標準入力からマスタに書き込んでいるのは、シェルに出力する必要があると言うことでしょうか(シェル側で読み取って何かに使う?)。
んー、親が延々と標準入力を読み続けているから、親プロセスが生き続けているということでなんでしょうか。それとも、read() が返らないとかでしょうか。
というわけで、使い方を間違えているのか、この状態(親子孫が生き続ける)が自然なのか、今の自分では判断がつきませんでした。
OSX や FreeBSD の script のソースがどこにあるかわからず読んでいないので、Linux と BSD とでプロセスの数が異なるのが、script の実装が異なるのか、もっと下のところで違いがあるのか、わかりません。

