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