
275
15.7 fork を使って低レベル処理を行う
待っている間は
CPU
時間を消費しません)。同様にして、あなたのプロセスが子プロセスにデー
タを送ろうとしたときに、子プロセス側でのデータの読み出しが追いつかなくなったら、読み出し
が追いつくまで、あなたのプロセスはサスペンドされます。プロセスの間にはバッファ(だいたい
8
キロバイト程度)があるので、実行の進み具合いの差をある程度は吸収してくれます。
なぜプロセスをファイルハンドルとして扱うのでしょうか。それは、何か処理を行った結果を、
子プロセスに渡す唯一の簡単な方法だからです。しかし子プロセスの出力を読むだけでよければ、
バッククォートを使うほうがはるかに簡単です。ただし、バッククォートの場合には、データが届
くたびに即座に読み出すということはできません。
例えば、
Unix
の
find
コマンドは、属性をもとにしてファイルを探します。対象となるファイ
ルが非常に多い場合(例えばルートディレクトリから開始した場合)、かなり時間がかかります。
find
コマンドをバッククォートで囲むこともできますが、通常は、次のようにして、結果が得ら
れるたびにどんどん処理を進めていったほうがよいでしょう。
open my $find_fh, '-|',
'find', qw( / -atime +90 -size +1000 -print )
or die "fork: $!";
while (<$find_fh>) {
chomp;
printf "%s size %dK ...