|
Packit Service |
f629e6 |
@load "fork"
|
|
Packit Service |
f629e6 |
|
|
Packit Service |
f629e6 |
BEGIN {
|
|
Packit Service |
f629e6 |
fn = ("fork.tmp." PROCINFO["pid"])
|
|
Packit Service |
f629e6 |
switch (pid = fork()) {
|
|
Packit Service |
f629e6 |
case -1:
|
|
Packit Service |
f629e6 |
printf "Error: fork failed with ERRNO %s\n", ERRNO
|
|
Packit Service |
f629e6 |
exit 1
|
|
Packit Service |
f629e6 |
case 0:
|
|
Packit Service |
f629e6 |
# child
|
|
Packit Service |
f629e6 |
printf "pid %s ppid %s\n", PROCINFO["pid"], PROCINFO["ppid"] > fn
|
|
Packit Service |
f629e6 |
exit 0
|
|
Packit Service |
f629e6 |
default:
|
|
Packit Service |
f629e6 |
# parent
|
|
Packit Service |
f629e6 |
erc = 1
|
|
Packit Service |
f629e6 |
if ((rc = wait()) < 0)
|
|
Packit Service |
f629e6 |
printf "Error: wait failed with ERRNO %s\n", ERRNO
|
|
Packit Service |
f629e6 |
else if (rc != pid)
|
|
Packit Service |
f629e6 |
printf "Error: wait returned %s instead of child pid %s\n", rc, pid
|
|
Packit Service |
f629e6 |
else if ((getline x < fn) != 1)
|
|
Packit Service |
f629e6 |
printf "Error: getline failed on temp file %s\n", fn
|
|
Packit Service |
f629e6 |
else {
|
|
Packit Service |
f629e6 |
close(fn) # required on non-POSIX systems
|
|
Packit Service |
f629e6 |
expected = ("pid " pid " ppid " PROCINFO["pid"])
|
|
Packit Service |
f629e6 |
if (x != expected)
|
|
Packit Service |
f629e6 |
printf "Error: child data (%s) != expected (%s)\n", x, expected
|
|
Packit Service |
f629e6 |
else if ((rc = system("rm " fn)) != 0)
|
|
Packit Service |
f629e6 |
printf "Error removing temp file %s with ERRNO %s\n", fn, ERRNO
|
|
Packit Service |
f629e6 |
else
|
|
Packit Service |
f629e6 |
erc = 0
|
|
Packit Service |
f629e6 |
}
|
|
Packit Service |
f629e6 |
exit erc
|
|
Packit Service |
f629e6 |
}
|
|
Packit Service |
f629e6 |
}
|