এই বিভাগে আমরা C/C++ এ একটি একক প্রোগ্রামে কীভাবে জম্বি প্রক্রিয়া এবং অরফান প্রক্রিয়া চালানো যায় তা দেখব। মূল আলোচনায় যাওয়ার আগে, আসুন দেখি জম্বি প্রক্রিয়া এবং এতিম প্রক্রিয়া কী।
জম্বি প্রসেস
একটি জম্বি প্রক্রিয়া হল এমন একটি প্রক্রিয়া যার কার্য সম্পাদন সম্পন্ন হয়েছে কিন্তু এটি এখনও প্রক্রিয়া সারণীতে একটি এন্ট্রি রয়েছে। জম্বি প্রক্রিয়াগুলি সাধারণত শিশু প্রক্রিয়াগুলির জন্য ঘটে, কারণ পিতামাতার প্রক্রিয়াটিকে এখনও তার সন্তানের প্রস্থান স্থিতি পড়তে হবে। একবার ওয়েটিং সিস্টেম কল ব্যবহার করে এটি সম্পন্ন হলে, জম্বি প্রক্রিয়াটি প্রক্রিয়া টেবিল থেকে বাদ দেওয়া হয়। এটি জম্বি প্রক্রিয়া কাটা হিসাবে পরিচিত।
অনাথ প্রক্রিয়া
অরফান প্রসেস হল সেই সমস্ত প্রসেস যেগুলি এখনও চলছে যদিও তাদের প্যারেন্ট প্রসেস শেষ বা শেষ হয়ে গেছে। একটি প্রক্রিয়া ইচ্ছাকৃতভাবে বা অনিচ্ছাকৃতভাবে অনাথ হতে পারে।
একটি ইচ্ছাকৃতভাবে অনাথ প্রক্রিয়া কোনো ম্যানুয়াল সমর্থন ছাড়াই পটভূমিতে সঞ্চালিত হয়। এটি সাধারণত একটি অনির্দিষ্টকালের জন্য চলমান পরিষেবা শুরু করতে বা ব্যবহারকারীর মনোযোগ ছাড়াই একটি দীর্ঘ-চলমান কাজ সম্পূর্ণ করার জন্য করা হয়৷
একটি অনিচ্ছাকৃতভাবে অনাথ প্রক্রিয়া তৈরি হয় যখন এর মূল প্রক্রিয়া ক্র্যাশ বা সমাপ্ত হয়। প্রসেস গ্রুপ মেকানিজম ব্যবহার করে অনিচ্ছাকৃত এতিম প্রক্রিয়াগুলি এড়ানো যেতে পারে।
এখন নিচের কোডে আমরা একই সাথে জম্বি এবং অরফান প্রসেস এক্সিকিউট করব। এখানে আমাদের একটি অভিভাবক প্রক্রিয়া আছে, এটির একটি সন্তান রয়েছে এবং এই সন্তানের আরেকটি সন্তান রয়েছে। যদি আমাদের নিয়ন্ত্রণ শিশু প্রক্রিয়ায় প্রবেশ করে, তাহলে আমরা 5 সেকেন্ডের জন্য মৃত্যুদন্ড বন্ধ করে দেব যাতে এটি পিতামাতার প্রক্রিয়াটি শেষ করতে পারে। এভাবে শিশু প্রক্রিয়া এতিম প্রক্রিয়ায় পরিণত হয়। এর পরে নাতি-নাতনি প্রক্রিয়াটি Zombie প্রক্রিয়াতে রূপান্তরিত হবে। নাতি-নাতনি মৃত্যুদন্ড শেষ করে যখন তার পিতামাতা (মূল প্রক্রিয়ার সন্তান) 1 সেকেন্ডের জন্য ঘুমায়। তাই নাতি-নাতনি প্রসেস টার্মিনেট বলে না, এবং এর এন্ট্রি প্রসেস টেবিলে থাকবে।
উদাহরণ কোড
#include <stdio.h> #include <unistd.h> int main() { int x = fork(); //create child process if (x > 0) //if x is non zero, then it is parent process printf("Inside Parent---- PID is : %d\n", getpid()); else if (x == 0) { //for chile process x will be 0 sleep(5); //wait for some times x = fork(); if (x > 0) { printf("Inside Child---- PID :%d and PID of parent : %d\n", getpid(), getppid()); while(1) sleep(1); printf("Inside Child---- PID of parent : %d\n", getppid()); }else if (x == 0) printf("Inside grandchild process---- PID of parent : %d\n", getppid()); } return 0; }
আউটপুট
soumyadeep@soumyadeep-VirtualBox:~$ ./a.out Inside Parent---- PID is : 3821 soumyadeep@soumyadeep-VirtualBox:~$ Inside Child---- PID :3822 and PID of parent : 686 Inside grandchild process---- PID of parent : 3822 soumyadeep@soumyadeep-VirtualBox:~$