Ich habe das Verhalten des Linux-Kernels schon seit einiger Zeit untersucht, und mir war immer klar, dass:
Wenn ein Prozess stirbt, werden alle seine Kinder an den
init
Prozess (PID 1) zurückgegeben, bis sie schließlich sterben.
Kürzlich hat mir jedoch jemand mit viel mehr Erfahrung als ich mit dem Kernel gesagt, dass:
Wenn ein Prozess beendet wird, sterben auch alle seine untergeordneten Elemente (es sei denn, Sie verwenden,
NOHUP
in welchem Fall sie zurückkehreninit
).
Auch wenn ich das nicht glaube, habe ich dennoch ein einfaches Programm geschrieben, um sicherzugehen. Ich weiß, dass ich mich sleep
bei Tests nicht auf time ( ) verlassen sollte , da alles von der Prozessplanung abhängt, aber für diesen einfachen Fall denke ich, dass das ausreichend ist.
int main(void){
printf("Father process spawned (%d).\n", getpid());
sleep(5);
if(fork() == 0){
printf("Child process spawned (%d => %d).\n", getppid(), getpid());
sleep(15);
printf("Child process exiting (%d => %d).\n", getppid(), getpid());
exit(0);
}
sleep(5);
printf(stdout, "Father process exiting (%d).\n", getpid());
return EXIT_SUCCESS;
}
Hier ist die Ausgabe des Programms mit dem zugehörigen ps
Ergebnis bei jedem printf
Gespräch:
$ ./test &
Father process spawned (435).
$ ps -ef | grep test
myuser 435 392 tty1 ./test
Child process spawned (435 => 436).
$ ps -ef | grep test
myuser 435 392 tty1 ./test
myuser 436 435 tty1 ./test
Father process exiting (435).
$ ps -ef | grep test
myuser 436 1 tty1 ./test
Child process exiting (436).
Nun, wie Sie sehen können, verhält sich dies so, wie ich es erwartet hätte. Der Waisenprozess (436) wird an init
(1) zurückgegeben, bis er stirbt.
Gibt es jedoch ein UNIX-basiertes System, auf dem dieses Verhalten nicht standardmäßig angewendet wird? Gibt es ein System, bei dem der Tod eines Prozesses sofort den Tod aller seiner Kinder auslöst?