perlでforkするメモ

perlでforkする実験を色々してみた。
結構色々分かったのでメモ。

  • 親が子を作って、プログラムをコピーして渡して実行する
  • 親が子を作った時のグローバル変数はそのままコピー?ループカウント変数は保持したまま。
  • 子が最初からプログラムを純粋に実行するわけではない?
#!/usr/bin/perl

use strict;
use warnings;

$| = 1;

# 並行して生むことが出来る子の数
my $child_max = 3;
my $child_num = 0;

# 処理は30回
my $roop_max = 30;
my $roop_count = 0;

my ($pid, $wait_pid, $sleep_time);

while ($roop_count != $roop_max) {
    $pid = fork;
    # 親が子を生むときは子のPIDを返す
    # 子がforkするときは0を返す
    # 失敗したら未定義値を返す
    if ($pid ne 0) {
        # 親の処理
        $child_num++;
        print "roop[$roop_count] fork child: ]
            all_child_num[$child_num] child_pid[$pid]\n";
    } elsif (defined $pid) {
        # 子の処理
        $sleep_time = rand 10;
        print "roop[$roop_count] start child process task:
            all_child_num[$child_num] task[sleep $sleep_time]\n";
        sleep $sleep_time;
        exit 0;
    } else {
        exit 1;
    }

    # 親の子プロセス数管理
    if ($child_num == $child_max) {
        print "roop[$roop_count] start  wait child process: 
            all_child_num[$child_num]\n";
        $wait_pid = wait;
        $child_num--;
        print "roop[$roop_count] finish wait child process:
            all_child_num[$child_num] exit_child_pid[$wait_pid]\n";
    }

    $roop_count++;
}

# 子プロセスが全て終わるのを待つ
# wait()はどれかの子プロセスを待つ
# waitする子プロセスが無ければ-1を返す
while ($wait_pid ne "-1") {
    $wait_pid = wait;
    print "roop[$roop_count] wait all child process:
         all_child_num[$child_num] exit_child_pid[$wait_pid]\n";
}