X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=perl%2FPrefork.pm;h=10c7ec1a70d7b477300285b990ec9b7111136136;hb=7db62ef1ca46a3891d2701b1b0607be16c7c5a5f;hp=bb39265b905f8c04b01dec568df50f3041275888;hpb=e87a0b5881f1a5214d22c415a4ffa3144d681312;p=chiark-utils.git diff --git a/perl/Prefork.pm b/perl/Prefork.pm index bb39265..10c7ec1 100644 --- a/perl/Prefork.pm +++ b/perl/Prefork.pm @@ -36,6 +36,10 @@ sub server_quit ($) { # Returns in the executor process sub become_monitor () { + close LISTEN; + eval { protocol_exchange(); 1; } + or fail_log("protocol exchange failed: $@"); + my $child = fork // fail_log("fork executor: $!"); if (!$child) { #---- executor ---- @@ -43,6 +47,7 @@ sub become_monitor () { open ::STDOUT, ">& $call_fds[1]" or fail_log("dup for fd1"); open ::STDERR, ">& $call_fds[2]" or fail_log("dup for fd2"); close_call_fds(); + $! = 0; return; } @@ -54,16 +59,8 @@ sub become_monitor () { _exit(0); } -sub forked_monitor () { - close LISTEN; - eval { protocol_exchange(); 1; } - or fail_log("protocol exchange failed: $@"); - return become_monitor(); -} - sub close_call_fds () { foreach (@call_fds) { - next if $_ <= 2; POSIX::close($_); } close CALL; @@ -93,7 +90,8 @@ sub protocol_read_fail ($) { } sub protocol_exchange () { - protocol_write("\n"); + my $greeting = "PFI\n\0\0\0\0"; + protocol_write($greeting); @call_fds = map { my $r; @@ -223,7 +221,7 @@ sub initialisation_complete { $child = fork // fail_log("fork for accepted call failed: $!"); if (!$child) { #---- monitor [1] ---- - forked_monitor(); + become_monitor(); } close(CALL); $errcount = 0;