Pixel Pedals of Tomakomai

北海道苫小牧市出身の初老の日常

fork()失敗談

やってしまった、と言うのが正直なところです。


こんなコードを書きました。子プロセスを5個立ち上げて、それぞれの子プロセスに1〜5の数字を1つだけ印字してもらうだけの簡単なプログラムです。

use strict;
use warnings;

foreach(1 .. 5){
    if(my $pid = fork()){
        # 親プロセス
        # NOP
    }elsif(defined $pid){
        # 子プロセス
        child($_);
    }else{
        die "sorry.";
    }
}

while(wait() > 0){}

exit(0);


sub child{
    my $num = shift;
    print "$$:$num\n";
}

期待するのは、例えば以下のような出力。

6201:1
6202:2
6203:3
6204:4
6205:5

が、返って来たのはこんなの。

6211:2
6210:1
6212:3
6213:4
6217:5
6214:5
6216:4
6218:4
6215:3
6219:5
6221:5
6220:2
6222:3
6228:3
6223:5
6227:5
6231:5
6233:5
6225:4
6226:4
6224:5
6230:4
6229:4
6235:5
6236:5
6238:5
6237:5
6234:5
6239:5
6232:4
6240:5

さて、何が間違えていたでしょう? ピアレビューの練習問題代わりにどうぞ≧(´▽`)≦


実際は、これを100以上の繰り返し処理で実行したため、システム停止しました。アホだオレ。なお、良い子は、生成する子プロセスの上限を管理する処理も忘れずにつけましょう。奥さんのエントリが参考になります。


1/24追記。忘れそうなので何が悪いのか書いときます。はてブの指摘の通り、このコードだと子プロセス側で exit() してないため、子プロセスもループの続きを処理してしまっていますorz。