• このエントリーをはてなブックマークに追加

メモ

fork 初心者かつ __DATA__ セクションの細かい仕様を把握できていない issm ですが,とりあえずこんなことがあった,ということで.

コード

n 回 fork を実行し,fork されたそれぞれのプロセスで Data::Section::Simple::get_data_section をするだけのものです:

# datasection.pl
use 5.12.0;
use warnings;
use Getopt::Long;
use Data::Section::Simple qw/get_data_section/;
use Time::HiRes ();
 
my %opts = ( n => 10 );
GetOptions( 'n=i' => \$opts{n} );
 
sub foo {
    my $id = shift;
    ( my $text = get_data_section('hoge') || 'FAILED' ) =~ s/\n*$/\n/;;
    printf '%02d: %s', $id, $text;
}
 
sub main {
    my $pid0 = $$;
 
    my $id;
    for my $i ( 1 .. $opts{n} ) {
        my $pid = fork();
        $id = $i;
        last if ! $pid;
    }
 
    if ( $$ == $pid0 ) {
        sleep 1;
    }
    else {
        Time::HiRes::sleep ( rand() / 100 );
        foo($id);
    }
}
 
main();
__DATA__
 
@@ hoge
foo bar baz

実行例

毎回同様の結果になるわけではありませんが,__DATA__ セクションの読み込みに失敗しているのが気になります:

% perl datasection.pl -n 50
12: foo bar baz
16: foo bar baz
19: foo bar baz
06: foo bar baz
04: foo bar baz
10: foo bar baz
14: foo bar baz
21: foo bar baz
05: foo bar baz
23: foo bar baz
20: foo bar baz
03: FAILED
02: foo bar baz
09: foo bar baz
15: FAILED
07: foo bar baz
22: foo bar baz
25: foo bar baz
08: foo bar baz
01: foo bar baz
24: foo bar baz
39: foo bar baz
31: foo bar baz
30: foo bar baz
29: FAILED
28: foo bar baz
26: foo bar baz
27: foo bar baz
17: foo bar baz
13: FAILED
38: foo bar baz
11: foo bar baz
18: foo bar baz
33: foo bar baz
46: foo bar baz
45: foo bar baz
40: FAILED
50: foo bar baz
48: foo bar baz
41: foo bar baz
32: foo bar baz
35: foo bar baz
44: foo bar baz
36: foo bar baz
34: foo bar baz
42: foo bar baz
43: FAILED
47: foo bar baz
49: foo bar baz
37: foo bar baz