इस खंड में हम देखेंगे कि C/C++ में एक ही प्रोग्राम में ज़ोंबी प्रोसेस और अनाथ प्रोसेस को कैसे निष्पादित किया जाए। मुख्य चर्चा पर जाने से पहले, आइए देखें कि ज़ोंबी प्रोसेस और अनाथ प्रोसेस क्या हैं।
ज़ोंबी प्रोसेस
एक ज़ोंबी प्रोसेस वह प्रोसेस है जिसका निष्पादन पूरा हो चुका है लेकिन उसकी प्रोसेस टेबल में अभी भी एक एंट्री है। ज़ोंबी प्रोसेस आमतौर पर चाइल्ड प्रोसेस के लिए होते हैं, क्योंकि पैरेंट प्रोसेस को अभी भी अपने चाइल्ड के एग्जिट स्टेटस को पढ़ने की आवश्यकता होती है। एक बार जब यह wait सिस्टम कॉल का उपयोग करके किया जाता है, तो ज़ोंबी प्रोसेस को प्रोसेस टेबल से समाप्त कर दिया जाता है। इसे ज़ोंबी प्रोसेस को रीपिंग के रूप में जाना जाता है।
अनाथ प्रोसेस
अनाथ प्रोसेस वे प्रोसेस हैं जो अभी भी चल रहे हैं भले ही उनके पैरेंट प्रोसेस समाप्त या समाप्त हो गए हों। एक प्रोसेस को जानबूझकर या अनजाने में अनाथ बनाया जा सकता है।
एक जानबूझकर अनाथ प्रोसेस किसी मैनुअल सपोर्ट के बिना बैकग्राउंड में चलता है। यह आमतौर पर एक अनिश्चित काल तक चलने वाली सर्विस शुरू करने या उपयोगकर्ता के ध्यान के बिना लंबे समय तक चलने वाले कार्य को पूरा करने के लिए किया जाता है।
एक अनजाने में अनाथ प्रोसेस तब बनता है जब उसका पैरेंट प्रोसेस क्रैश या समाप्त हो जाता है। अनजाने अनाथ प्रोसेस को प्रोसेस ग्रुप मैकेनिज्म का उपयोग करके टाला जा सकता है।
अब निम्नलिखित कोड में हम ज़ोंबी और अनाथ प्रोसेस को एक साथ निष्पादित करेंगे। यहां हमारे पास एक पैरेंट प्रोसेस है, उसका एक चाइल्ड है, और इस चाइल्ड का एक और चाइल्ड है। यदि हमारा नियंत्रण चाइल्ड प्रोसेस में जाता है, तो हम 5 सेकंड के लिए निष्पादन रोक देंगे ताकि यह पैरेंट प्रोसेस को समाप्त कर सके। इस प्रकार चाइल्ड प्रोसेस अनाथ प्रोसेस बन जाता है। उसके बाद ग्रैंडचाइल्ड प्रोसेस ज़ोंबी प्रोसेस में बदल जाएगा। ग्रैंडचाइल्ड निष्पादन समाप्त करता है जब उसका पैरेंट (मुख्य प्रोसेस का चाइल्ड) 1 सेकंड के लिए सोता है। इसलिए ग्रैंडचाइल्ड प्रोसेस टर्मिनेट कॉल नहीं करता, और उसकी एंट्री प्रोसेस टेबल में रहेगी।
उदाहरण कोड
#include <stdio.h>
#include <unistd.h>
int main() {
int x = fork(); // चाइल्ड प्रोसेस बनाएं
if (x > 0) // यदि x शून्येतर है, तो यह पैरेंट प्रोसेस है
printf("पैरेंट के अंदर---- PID है: %d\n", getpid());
else if (x == 0) { // चाइल्ड प्रोसेस के लिए x 0 होगा
sleep(5); // कुछ समय प्रतीक्षा करें
x = fork();
if (x > 0) {
printf("चाइल्ड के अंदर---- PID: %d और पैरेंट का PID: %d\n", getpid(), getppid());
while (1)
sleep(1);
printf("चाइल्ड के अंदर---- पैरेंट का PID: %d\n", getppid());
} else if (x == 0)
printf("ग्रैंडचाइल्ड प्रोसेस के अंदर---- पैरेंट का PID: %d\n", getppid());
}
return 0;
}
आउटपुट
पैरेंट के अंदर---- PID है: 3821 चाइल्ड के अंदर---- PID: 3822 और पैरेंट का PID: 686 ग्रैंडचाइल्ड प्रोसेस के अंदर---- पैरेंट का PID: 3822
नोट: PID मान प्रत्येक रन में भिन्न होंगे। चाइल्ड का पैरेंट PID 686 (init प्रोसेस) दिखाता है क्योंकि मूल पैरेंट समाप्त हो गया है।