3 # Test that getppid() follows UNIX semantics: when the parent process
4 # dies, the child is reparented to the init process
5 # The init process is usually 1, but doesn't have to be, and there's no
6 # standard way to find out what it is, so the only portable way to go it so
7 # attempt 2 reparentings and see if the PID both orphaned grandchildren get is
8 # the same. (and not ours)
19 for my $syscall (qw(pipe fork waitpid getppid)) {
20 if (!$Config{"d_$syscall"}) {
21 print "1..0 # Skip: no $syscall\n";
29 sub fork_and_retrieve {
31 pipe my ($r, $w) or die "pipe: $!\n";
32 my $pid = fork; defined $pid or die "fork: $!\n";
39 die "Garbled output '$_'"
40 unless my ($first, $second) = /^(\d+),(\d+)\z/;
41 cmp_ok ($first, '>=', 1, "Parent of $which grandchild");
42 cmp_ok ($second, '>=', 1, "New parent of orphaned $which grandchild");
43 isnt($first, $second, "Orphaned $which grandchild got a new parent");
48 # Prevent test.pl from thinking that we failed to run any tests.
52 my $pid2 = fork; defined $pid2 or die "fork: $!\n";
59 my $ppid1 = getppid();
60 # Wait for immediate parent to exit
62 my $ppid2 = getppid();
63 print $w "$ppid1,$ppid2\n";
69 my $first = fork_and_retrieve("first");
70 my $second = fork_and_retrieve("second");
71 is ($first, $second, "Both orphaned grandchildren get the same new parent");
72 isnt ($first, $$, "And that new parent isn't this process");