# 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 ----
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;
}
_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;
}
sub protocol_exchange () {
- protocol_write("\n");
+ my $greeting = "PFI\n\0\0\0\0";
+ protocol_write($greeting);
@call_fds = map {
my $r;
$child = fork // fail_log("fork for accepted call failed: $!");
if (!$child) {
#---- monitor [1] ----
- forked_monitor();
+ become_monitor();
}
close(CALL);
$errcount = 0;