Saya telah mempelajari perilaku kernel Linux untuk beberapa waktu sekarang, dan selalu jelas bagi saya bahwa:
Ketika suatu proses mati, semua anak-anaknya diberikan kembali ke
initproses (PID 1) sampai mereka akhirnya mati.
Namun, baru-baru ini, seseorang dengan pengalaman lebih dari saya dengan kernel mengatakan kepada saya bahwa:
Ketika proses keluar, semua anak-anaknya juga mati (kecuali jika Anda menggunakan
NOHUPdalam kasus apa mereka kembaliinit).
Sekarang, meskipun saya tidak percaya ini, saya masih menulis program sederhana untuk memastikannya. Saya tahu saya tidak harus bergantung pada waktu ( sleep) untuk tes karena semuanya tergantung pada penjadwalan proses, namun untuk kasus sederhana ini, saya pikir itu sudah cukup.
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;
}
Ini adalah output program, dengan pshasil terkait setiap kali printfberbicara:
$ ./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).
Sekarang, seperti yang Anda lihat, ini berperilaku seperti yang saya harapkan. Proses yatim (436) diberikan kembali ke init(1) sampai mati.
Namun, apakah ada sistem berbasis UNIX di mana perilaku ini tidak berlaku secara default? Apakah ada sistem di mana kematian suatu proses segera memicu kematian semua anak-anaknya?