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
init
proses (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
NOHUP
dalam 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 ps
hasil terkait setiap kali printf
berbicara:
$ ./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?