REDIR(out, 1);
REDIR(err, 2);
for (sig = 1; sig < NSIG; sig++)
- signal(sig, SIG_DFL); /* ignore errorrs on signals */
- ret = sigprocmask(SIG_SETMASK, &old, NULL);
- if (ret != 0) xerr("sigprocmask failed in vfork child");
+ signal(sig, SIG_DFL); /* ignore errors on signals */
+ /*
+ * don't bother unblocking, we don't want signals
+ * to the group taking out a subprocess
+ */
execve(filename, argv, envp);
xerr("execve failed");
}
package PublicInbox::SpawnPP;
use strict;
use warnings;
-use POSIX qw(dup2);
+use POSIX qw(dup2 :signal_h);
# Pure Perl implementation for folks that do not use Inline::C
sub public_inbox_fork_exec ($$$$$$) {
my ($in, $out, $err, $f, $cmd, $env) = @_;
+ my $old = POSIX::SigSet->new();
+ my $set = POSIX::SigSet->new();
+ $set->fillset or die "fillset failed: $!";
+ sigprocmask(SIG_SETMASK, $set, $old) or die "can't block signals: $!";
my $pid = fork;
if ($pid == 0) {
if ($in != 0) {
die "exec $cmd->[0] failed: $!\n";
}
}
+ sigprocmask(SIG_SETMASK, $old) or die "can't unblock signals: $!";
$pid;
}
is(kill(0, $pid), 1, 'child process is running');
ok(!defined(sysread($fh, my $buf, 1)) && $!{EAGAIN},
'sysread returned quickly with EAGAIN');
- is(kill(15, $pid), 1, 'child process killed early');
+ is(kill(9, $pid), 1, 'child process killed early');
is(waitpid($pid, 0), $pid, 'child process reapable');
isnt($?, 0, '$? set properly: '.$?);
}