fork() में अप्रत्याशित ब्रांचिंग का उत्सुक मामला
निम्न कोड स्निपेट पर विचार करें जो चाइल्ड प्रोसेस बनाने के लिए fork() प्रिमिटिव का उपयोग करता है:
#include
#include
#include
int main(void)
{
int i;
for(i = 0; i आश्चर्यजनक रूप से, इस कार्यक्रम को निष्पादित करने से आठ आउटपुट डॉट्स मिलते हैं, जो कि आपके आरंभिक अनुमान से छह अधिक है। ऐसा क्यों होता है?
छिपी प्रक्रियाओं का अनावरण
इस रहस्य को जानने के लिए, आइए फोर्क() के संचालन के बारे में गहराई से जानें। fork() वर्तमान प्रक्रिया की एक प्रतिकृति बनाता है, जिसके परिणामस्वरूप एक अभिभावक और एक संतान प्रक्रिया होती है।
प्रारंभ में, एक एकल प्रक्रिया होती है, जो दो में विभाजित होती है। ये दोनों प्रक्रियाएं हर बार एक बिंदु प्रिंट करते हुए, लूप के लिए क्रमिक रूप से निष्पादित होती हैं। दूसरे पुनरावृत्ति पर, प्रत्येक प्रक्रिया फिर से द्विभाजित होती है, जिससे कुल चार प्रक्रियाएँ बनती हैं। ये चार प्रक्रियाएं समाप्त होने से पहले एक बिंदु प्रिंट करती हैं। तुरंत। जब सभी चार प्रक्रियाएं अपने दूसरे बिंदु प्रिंट करती हैं, तो वे बफ़र हो जाते हैं। यह वह जगह है जहां गुप्त प्रभाव उत्पन्न होता है।
फोर्क() पर, बफ़र किए गए बिंदु चाइल्ड प्रक्रियाओं द्वारा विरासत में मिलते हैं। इसलिए, जब प्रत्येक चाइल्ड प्रक्रिया बाहर निकलती है, तो उसका बफ़र किया गया बिंदु आउटपुट स्ट्रीम पर दिखाई देता है। इन चार विलंबित बिंदुओं को मुद्रित चार बिंदुओं में जोड़ने से अप्रत्याशित रूप से आठ की अप्रत्याशित संख्या बनती है। एफफ्लश(स्टडआउट); प्रत्येक printf() कथन के बाद। यह आउटपुट को तुरंत भेजने के लिए बाध्य करता है, जिससे यह सुनिश्चित होता है कि बिंदुओं की अपेक्षित संख्या प्रदर्शित होती है।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3