Linux, waitpid, WNOHANG, untergeordneter Prozess, Zombie

Ich starte mein Programm als Daemon.Vater-Prozess nur auf Kind-Prozess warten, wenn es tot ist unerwartet, Gabel und wieder warten.
for (; 1;) {
  if (fork() == 0) break;
  int sig = 0;
  for (; 1; usleep(10000)) {
    pid_t wpid = waitpid(g->pid[1], &sig, WNOHANG);
    if (wpid > 0) break;
    if (wpid < 0) print("wait error: %s\n", strerror(errno));
  }
}
Wenn jedoch ein untergeordneter Prozess mit dem Signal -9 getötet wird, wechselt der untergeordnete Prozess zum Zombie-Prozess.

waitpid sollte die pid des untergeordneten Prozesses sofort zurückgeben!
Aberwaitpid bekam die PID-Nummer nach ca. 90 Sekunden,

cube     28139  0.0  0.0  70576   900 ?        Ss   04:24   0:07 ./daemon -d
cube     28140  9.3  0.0      0     0 ?        Zl   04:24 106:19 [daemon] <defunct>
Hier ist die Strafe des VatersDer Vater bleibt nicht hängen, wait4 wurde immer angerufen.
strace -p 28139
Process 28139 attached - interrupt to quit
restart_syscall(<... resuming interrupted call ...>) = 0
wait4(28140, 0x7fff08a2681c, WNOHANG, NULL) = 0
nanosleep({0, 10000000}, NULL)          = 0
wait4(28140, 0x7fff08a2681c, WNOHANG, NULL) = 0
Ungefähr 90 Sekunden später bekam Vater das SIGCHILD und wait4 gab die PID des toten Kindes zurück.
--- SIGCHLD (Child exited) @ 0 (0) ---
restart_syscall(<... resuming interrupted call ...>) = 0
wait4(28140, [{WIFSIGNALED(s) && WTERMSIG(s) == SIGKILL}], WNOHANG, NULL) = 28140
Warum wird der untergeordnete Prozess nicht sofort beendet? Im Gegenteil, es wird unerwartet zu einem Zombie.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage