मैं पिछले कुछ समय से लिनक्स कर्नेल व्यवहार का अध्ययन कर रहा हूं, और यह मेरे लिए हमेशा स्पष्ट है:
जब एक प्रक्रिया मर जाती है, तो उसके सभी बच्चों को
init
प्रक्रिया (पीआईडी 1) को वापस दे दिया जाता है जब तक कि वे अंततः मर नहीं जाते।
हालाँकि, हाल ही में, कर्नेल के साथ मुझसे अधिक अनुभव वाले किसी व्यक्ति ने मुझे बताया कि:
जब कोई प्रक्रिया बाहर निकलती है, तो उसके सभी बच्चे भी मर जाते हैं (जब तक कि आप
NOHUP
किस स्थिति में उनका उपयोग नहीं करते हैंinit
)।
अब, भले ही मुझे इस पर विश्वास न हो, फिर भी मैंने इसे सुनिश्चित करने के लिए एक सरल कार्यक्रम लिखा। मुझे पता है कि मुझे sleep
परीक्षणों पर समय ( ) के लिए भरोसा नहीं करना चाहिए क्योंकि यह सब प्रक्रिया निर्धारण पर निर्भर करता है, फिर भी इस सरल मामले के लिए, मुझे लगता है कि यह काफी पर्याप्त है।
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;
}
यहां कार्यक्रम का आउटपुट, संबंधित ps
परिणाम के साथ हर बार printf
बातचीत है:
$ ./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).
अब, जैसा कि आप देख सकते हैं, यह काफी व्यवहार करता है जैसा कि मैंने इसकी उम्मीद की होगी। अनाथ प्रक्रिया (436) init
मर जाने तक (1) वापस दे दी जाती है।
हालाँकि, क्या कोई UNIX- आधारित प्रणाली है, जिस पर यह व्यवहार डिफ़ॉल्ट रूप से लागू नहीं होता है? क्या ऐसी कोई प्रणाली है जिस पर किसी प्रक्रिया की मृत्यु से उसके सभी बच्चों की मृत्यु तुरंत हो जाती है?