6 skip_all_if_miniperl();
7 skip_all_without_config(qw(d_fork));
11 use constant TRUE => ($^X, '-e', 'exit 0');
17 skip 'Platform doesn\'t support SIGCHLD', 4 if not exists $SIG{CHLD};
23 while ((my $child = waitpid(-1, POSIX::WNOHANG())) > 0) {
24 note "Reaped: $child";
28 my $pid = fork // die "Can't fork: $!";
30 note("Child PID: $$");
31 Time::HiRes::sleep(0.250);
35 test_system('without reaper');
37 test_system('with reaper');
39 note("Waiting briefly for SIGCHLD...");
40 Time::HiRes::sleep(0.500);
42 ok(@pids == 1, 'Reaped only one process');
43 ok($pids[0] == $pid, "Reaped the right process.") or diag(Dumper(\@pids));
49 my $expected_zeroes = 10;
52 # This test is looking for a race between system()'s waitpid() and a
53 # signal handler. Looping a few times increases the chances of
56 for (1..$expected_zeroes) {
57 $got_zeroes++ unless system(TRUE);
61 $got_zeroes, $expected_zeroes,
62 "system() $subtest succeeded $got_zeroes times out of $expected_zeroes"