フォークにおけるスコープの謎 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、子プロセスあたりのドキュメントを追う必要がありそうですね。調査後、またアウトプットしたいと思います。