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";
}