Line | |
---|
1 | #!./perl
|
---|
2 |
|
---|
3 | # Test that getppid() follows UNIX semantics: when the parent process
|
---|
4 | # dies, the child is reparented to the init process (pid 1).
|
---|
5 |
|
---|
6 | BEGIN {
|
---|
7 | chdir 't' if -d 't';
|
---|
8 | @INC = qw(../lib);
|
---|
9 | }
|
---|
10 |
|
---|
11 | use strict;
|
---|
12 | use Config;
|
---|
13 |
|
---|
14 | BEGIN {
|
---|
15 | for my $syscall (qw(pipe fork waitpid getppid)) {
|
---|
16 | if (!$Config{"d_$syscall"}) {
|
---|
17 | print "1..0 # Skip: no $syscall\n";
|
---|
18 | exit;
|
---|
19 | }
|
---|
20 | }
|
---|
21 | print "1..3\n";
|
---|
22 | }
|
---|
23 |
|
---|
24 | pipe my ($r, $w) or die "pipe: $!\n";
|
---|
25 | my $pid = fork; defined $pid or die "fork: $!\n";
|
---|
26 |
|
---|
27 | if ($pid) {
|
---|
28 | # parent
|
---|
29 | close $w;
|
---|
30 | waitpid($pid, 0) == $pid or die "waitpid: $!\n";
|
---|
31 | print <$r>;
|
---|
32 | }
|
---|
33 | else {
|
---|
34 | # child
|
---|
35 | close $r;
|
---|
36 | my $pid2 = fork; defined $pid2 or die "fork: $!\n";
|
---|
37 | if ($pid2) {
|
---|
38 | close $w;
|
---|
39 | sleep 1;
|
---|
40 | }
|
---|
41 | else {
|
---|
42 | # grandchild
|
---|
43 | my $ppid1 = getppid();
|
---|
44 | print $w "not " if $ppid1 <= 1;
|
---|
45 | print $w "ok 1 # ppid1=$ppid1\n";
|
---|
46 | sleep 2;
|
---|
47 | my $ppid2 = getppid();
|
---|
48 | print $w "not " if $ppid1 == $ppid2;
|
---|
49 | print $w "ok 2 # ppid2=$ppid2, ppid1!=ppid2\n";
|
---|
50 | print $w "not " if $ppid2 != 1;
|
---|
51 | print $w "ok 3 # ppid2=1\n";
|
---|
52 | }
|
---|
53 | exit 0;
|
---|
54 | }
|
---|
Note:
See
TracBrowser
for help on using the repository browser.