北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

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。