Blame test/fork2.awk

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