近頃版/another blog@hatena/Wiki/BBS
< アクセスログより。 | Pass perl's data object over fork-exec. >
'new_with_fork' などという名前のやってることは自明になるのでいいのだがそれをやってしまうこと自体どうよ、というスタブのコンストラクタを書いてみた。
sub new_with_fork { my($parent,$child) = IO::Socket->socketpair(AF_UNIX,SOCK_STREAM,0); unless($parent){ return undef; } my $pid = fork(); if($pid) { # Parent $parent->close(); bless $child ,MyProject::Stub::ToChild; my $prof = \%{*$child}; $prof->{pid} = $pid; return $child; }elsif(defined $pid) { # Child $child->close(); bless $parent,MyProject::Stub::ToParent; child_main($parent); exit(1); # never come here. } } sub child_main { my $parent = shift; ... }
IO::Socket->socketpair()で作ったsocketpairをforkした親と子に渡してそれぞれで再blessして子は勝手に動きだし、呼出し元には(子に繋がっている)親側ソケットだけを返す、という動きなのでこれはこれで正しいように思う(親側のメインのソースに子のロジックを書かなくて済むし)のだが、中で勝手にforkするのが気持ち悪いかもしれない。
だから名前で自明にしてみたわけなのだがそれができる事自体がオブジェクト指向Perlの利点でもあり欠点でもあり、といういつもの話に入るのでこの段これまで。