Linux çekirdeği davranışını uzun zamandır araştırıyorum ve bana her zaman açıktı:
Bir süreç öldüğünde, tüm çocukları
init
sonunda ölünceye kadar işleme (PID 1) geri verilir .
Ancak, son zamanlarda, çekirdekten benden çok daha fazla deneyime sahip biri bana şunu söyledi:
(Kullandığınız sürece süreç sonlandığında, tüm çocuklar da öldüğünde
NOHUP
onlar geri almak bu durumdainit
).
Şimdi, buna inanmasam da, emin olmak için hala basit bir program yazdım. Her şey sleep
süreç programlamasına bağlı olduğu için testler için zamana ( ) dayanmamam gerektiğini biliyorum , ancak bu basit durum için, bunun yeterli olduğunu düşünüyorum.
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;
}
İşte programın çıktısı, ps
sonuçta her printf
görüşmede ilgili sonuç :
$ ./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).
Şimdi, gördüğünüz gibi, beklediğim gibi davranıyor. Yetim işlemi (436), init
ölene dek (1) e geri verilir .
Ancak, bu davranışın varsayılan olarak uygulanmadığı UNIX tabanlı bir sistem var mı? Bir sürecin ölümünün hemen tüm çocuklarının ölümünü tetiklediği herhangi bir sistem var mı?