কম্পিউটার টিউটোরিয়াল

সি প্রোগ্রামে জোম্বি (Zombie) ও অরফান (Orphan) প্রসেস একসাথে এক্সিকিউট করা

এই সেকশনে দেখব কীভাবে একটি সিঙল প্রোগ্রামে জোম্বি প্রসেস ও অরফান প্রসেস একসাথে এক্সিকিউট করা যায়। उससे পহলে জানি জোম্বি ও অরফান প্রসেস কী।

জোম্বি প্রসেস (Zombie Processes)

জোম্বি প্রসেস হলো এমন প্রসেস যার এক্সিকিউশন কমপ্লিট হয়েছে কিন্তু এখনও প্রসেস টেবিলে এন্ট্রি রয়েছে। জোম্বি প্রসেস সাধারণত চাইল্ড প্রসেসের জন্য হয়, কারণ পেরেন্ট প্রসেস এখনও চাইল্ডের এক্সিট স্ট্যাটাস পড়তে চায়। একবার wait সিস্টেম কল দিয়ে এটি পড়া হলে জোম্বি প্রসেস প্রসেস টেবিল থেকে মুছে ফেলা হয়। এটিকে "reaping the zombie process" বলা হয়।

অরফান প্রসেস (Orphan Processes)

অরফান প্রসেস হলো সেসব প্রসেস যারা তাদের পেরেন্ট প্রসেস টার্মিনেট বা ফিনিশ হওয়ার পরেও চলতে থাকে। একটি প্রসেস ইন্টেনশনালি বা অনইন্টেনশনালি অরফান হতে পারে।

  • ইন্টেনশনালি অরফান: ব্যাকগ্রাউন্ডে ম্যানুয়াল সাপোর্ট ছাড়া চলমান সার্ভিস বা লং-রানিং জবের জন্য।
  • অনইন্টেনশনালি অরফান: পেরেন্ট প্রসেস ক্র্যাশ বা টার্মিনেট হলে। প্রসেস গ্রুপ মেকানিজম দিয়ে এড়ানো যায়।

নিচের কোডে জোম্বি ও অরফান প্রসেস একসাথে এক্সিকিউট করা হয়েছে। এখানে একটি পেরেন্ট প্রসেস আছে, এর একটি চাইল্ড, আর চাইল্ডটির আরেকটি চাইল্ড (গ্রান্ডচাইল্ড)। যদি কন্ট্রোল চাইল্ড প্রসেসে ঢুকা হয়, তবে ৫ সেকেন্ড স্লিপ করা হয় যাতে পেরেন্ট প্রসেস ফিনিশ হয়ে যায়। তখন চাইল্ড প্রসেস অরফান হয়ে যায়। তারপর গ্রান্ডচাইল্ড প্রসেস জোম্বি হয়ে যায়। গ্রান্ডচাইল্ড এক্সিকিউশন ফিনিশ হয় যখন এর পেরেন্ট (মূল প্রসেসের চাইল্ড) ১ সেকেন্ড স্লিপ করে। সুতরাং গ্রান্ডচাইল্ড টার্মিনেট কল না করেই প্রসেস টেবিলে এর এন্ট্রি রয়ে যায়।

উদাহরণ কোড

#include <stdio.h>
#include <unistd.h>
int main() {
    int x = fork(); // চাইল্ড প্রসেস তৈরি
    if (x > 0) { // x নন-জিরো হলে পেরেন্ট প্রসেস
        printf("Inside Parent---- PID is : %d\n", getpid());
    } else if (x == 0) { // চাইল্ড প্রসেসের জন্য x = 0
        sleep(5); // কিছুক্ষণ অপেক্ষা
        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:~$
  1. লিনাক্সে জম্বি ও অর্ফান প্রসেস

  2. উইন্ডোজ ১০-এ লুকানো ও জিড়ি সফটওয়্যার আনইনস্টল করার পদ্ধতি

  3. ডেস্কটপ শর্টকাট কী এবং এটি কীভাবে কাজ করে?

  4. Windows-এ প্রোগ্রামের CPU ব্যবহার সীমাবদ্ধ করার উপায়