আমি বেশ কিছুদিন ধরে লিনাক্স কার্নেল আচরণটি অধ্যয়ন করছি এবং এটি আমার কাছে সর্বদা স্পষ্ট ছিল:
যখন কোনও প্রক্রিয়া মারা যায়,
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) এ ফিরিয়ে দেওয়া হয় ।
তবে, ইউনিক্স-ভিত্তিক এমন কোনও ব্যবস্থা আছে যার উপর এই আচরণটি ডিফল্টরূপে প্রয়োগ হয় না? এমন কোনও ব্যবস্থা আছে যার উপরে কোনও প্রক্রিয়া মারা যাওয়ার সাথে সাথেই তার সমস্ত শিশুদের মৃত্যুর কারণ হয়?