フォークにおけるスコープの謎 2
フォークにおけるスコープの謎 - ABラボラトリに引き続いてのエントリ。
前回、
ダンプしているメモリアドレスは同じはずなのに、各子プロセス、親プロセス中で値が変化している。
と書きましたが、実際にメモリアドレスを表示させてみればいいじゃん、ということで表示してみました。
ソースコード
#!/usr/bin/perl use strict; use warnings; use LWP::UserAgent; use Parallel::ForkManager; use Data::Dumper; my $MAX_PROCESSES = 10; my $pm = new Parallel::ForkManager($MAX_PROCESSES); my @urls = qw(http://blog.livedoor.jp/dankogai/ http://d.hatena.ne.jp/ablabo/ http://d.hatena.ne.jp/onishi/); my %Data; print \%Data, "\n"; #$Data{'key'} = 'value'; for my $url (@urls) { my $pid = $pm->start and next; my $ua = LWP::UserAgent->new(); my $ans = $ua->head($url); print "##################\n"; $Data{$url} = $ans->last_modified || 'Nothing'; print \%Data, "\n"; #print Dumper(\%Data); print "##################\n"; $pm->finish; } $pm->wait_all_children; print "Dump Start.\n"; print \%Data, "\n"; #print Dumper(\%Data); print "Dump End.\n";
実行結果
HASH(0x1a43ff0)
##################
HASH(0x1bc74e8)
##################
##################
HASH(0x1d7e56c)
##################
##################
HASH(0x1e47f98)
##################
Dump Start.
HASH(0x1a43ff0)
Dump End.
「メモリアドレスは同じ」という予想に反して、子プロセス中ではメモリアドレスが異なってますね。親プロセスから子プロセスに分岐するとき、グローバルに宣言したハッシュのコピーをとる模様。
この問題を解決するにはどうやらfork、子プロセスあたりのドキュメントを追う必要がありそうですね。調査後、またアウトプットしたいと思います。