फोर्क सिस्टम कॉल लिनक्स

Fork System Call Linux



फोर्क सिस्टम कॉल का उपयोग नई प्रक्रियाओं को बनाने के लिए किया जाता है। नव निर्मित प्रक्रिया बाल प्रक्रिया है। वह प्रक्रिया जो कांटा बुलाती है और एक नई प्रक्रिया बनाती है वह मूल प्रक्रिया है। बच्चे और माता-पिता की प्रक्रियाओं को समवर्ती रूप से निष्पादित किया जाता है।

लेकिन बच्चे और माता-पिता की प्रक्रियाएं अलग-अलग मेमोरी स्पेस पर रहती हैं। इन मेमोरी स्पेस में समान सामग्री होती है और एक प्रक्रिया द्वारा जो भी ऑपरेशन किया जाता है वह दूसरी प्रक्रिया को प्रभावित नहीं करेगा।







जब बच्चे की प्रक्रियाएं बनाई जाती हैं; अब दोनों प्रक्रियाओं में एक ही प्रोग्राम काउंटर (पीसी) होगा, इसलिए ये दोनों प्रक्रियाएं एक ही अगले निर्देश की ओर इशारा करेंगी। मूल प्रक्रिया द्वारा खोली गई फाइलें चाइल्ड प्रोसेस के लिए समान होंगी।



चाइल्ड प्रोसेस बिल्कुल उसके पैरेंट के समान है लेकिन प्रोसेस आईडी में अंतर है:



  1. चाइल्ड प्रोसेस की प्रोसेस आईडी एक यूनिक प्रोसेस आईडी है जो अन्य सभी मौजूदा प्रोसेस की आईडी से अलग है।
  2. माता-पिता की प्रक्रिया आईडी बच्चे के माता-पिता की प्रक्रिया आईडी के समान होगी।

बाल प्रक्रिया के गुण

चाइल्ड प्रोसेस में निम्नलिखित कुछ गुण होते हैं:





  1. CPU काउंटर और संसाधन उपयोग को शून्य पर रीसेट करने के लिए प्रारंभ किया जाता है।
  2. जब पैरेंट प्रक्रिया को समाप्त कर दिया जाता है, तो चाइल्ड प्रोसेस को कोई संकेत प्राप्त नहीं होता है क्योंकि prctl() में PR_SET_PDEATHSIG विशेषता रीसेट हो जाती है।
  3. फोर्क () को कॉल करने के लिए इस्तेमाल किया जाने वाला थ्रेड चाइल्ड प्रोसेस बनाता है। तो बच्चे की प्रक्रिया का पता माता-पिता के समान ही होगा।
  4. पैरेंट प्रोसेस का फाइल डिस्क्रिप्टर चाइल्ड प्रोसेस द्वारा इनहेरिट किया जाता है। उदाहरण के लिए फ़ाइल की ऑफ़सेट या फ़्लैग की स्थिति और I/O विशेषताओं को चाइल्ड और पैरेंट प्रक्रियाओं के फ़ाइल डिस्क्रिप्टर के बीच साझा किया जाएगा। तो पैरेंट क्लास का फाइल डिस्क्रिप्टर चाइल्ड क्लास के उसी फाइल डिस्क्रिप्टर को संदर्भित करेगा।
  5. पैरेंट प्रोसेस के ओपन मैसेज क्यू डिस्क्रिप्टर चाइल्ड प्रोसेस द्वारा इनहेरिट किए जाते हैं। उदाहरण के लिए यदि फ़ाइल डिस्क्रिप्टर में मूल प्रक्रिया में एक संदेश होता है तो वही संदेश चाइल्ड प्रोसेस के संबंधित फ़ाइल डिस्क्रिप्टर में मौजूद होगा। तो हम कह सकते हैं कि इन फ़ाइल डिस्क्रिप्टर के ध्वज मान समान हैं।
  6. इसी तरह ओपन डायरेक्टरी स्ट्रीम चाइल्ड प्रोसेस द्वारा इनहेरिट की जाएगी।
  7. चाइल्ड क्लास का डिफॉल्ट टाइमर स्लैक वैल्यू पैरेंट क्लास के मौजूदा टाइमर स्लैक वैल्यू के समान है।

गुण जो बाल प्रक्रिया द्वारा विरासत में नहीं मिले हैं

निम्नलिखित कुछ गुण हैं जो चाइल्ड प्रोसेस द्वारा इनहेरिट नहीं किए गए हैं:

  1. मेमोरी लॉक
  2. चाइल्ड क्लास का पेंडिंग सिग्नल खाली है।
  3. प्रक्रिया से जुड़े रिकॉर्ड लॉक (fcntl ())
  4. अतुल्यकालिक I/O संचालन और I/O सामग्री।
  5. निर्देशिका परिवर्तन सूचनाएं।
  6. अलार्म (), सेटटिमर () जैसे टाइमर बाल वर्ग द्वारा विरासत में नहीं मिले हैं।

सी . में कांटा ()

कांटा() में कोई तर्क नहीं है और कांटा() का वापसी प्रकार पूर्णांक है। जब कांटा () का उपयोग किया जाता है, तो आपको निम्न शीर्षलेख फ़ाइलों को शामिल करना होगा:



#शामिल
#शामिल
#शामिल

कांटा () के साथ काम करते समय, टाइप . के लिए इस्तेमाल किया जा सकता है pid_t प्रक्रियाओं के लिए आईडी के रूप में pid_t में परिभाषित किया गया है।

हेडर फ़ाइल वह जगह है जहां कांटा() परिभाषित किया गया है, इसलिए आपको इसे अपने प्रोग्राम में फोर्क() का उपयोग करने के लिए शामिल करना होगा।

वापसी प्रकार को परिभाषित किया गया है और कांटा() कॉल को . इसलिए, आपको फोर्क() सिस्टम कॉल का उपयोग करने के लिए अपने प्रोग्राम में दोनों को शामिल करने की आवश्यकता है।

कांटा का सिंटेक्स ()

लिनक्स, उबंटू में फोर्क () सिस्टम कॉल का सिंटैक्स इस प्रकार है:

pid_t कांटा (शून्य);

वाक्य रचना में वापसी प्रकार है pid_t . जब चाइल्ड प्रोसेस सफलतापूर्वक बन जाता है, तो चाइल्ड प्रोसेस का PID पेरेंट प्रोसेस में वापस आ जाता है और 0 चाइल्ड प्रोसेस में ही वापस आ जाएगा।

यदि कोई त्रुटि है तो -1 को मूल प्रक्रिया में वापस कर दिया जाता है और चाइल्ड प्रोसेस नहीं बनता है।

No arguments are passed to fork(). 

उदाहरण 1: कॉलिंग कांटा ()

निम्नलिखित उदाहरण पर विचार करें जिसमें हमने एक नई चाइल्ड प्रोसेस बनाने के लिए फोर्क () सिस्टम कॉल का उपयोग किया है:

कोड:

#शामिल
#शामिल
#शामिल

NSमुख्य()
{
कांटा();
printf ('फोर्क () सिस्टम कॉल का उपयोग करना'एन');
वापसी 0;
}

आउटपुट:

फोर्क () सिस्टम कॉल का उपयोग करना
फोर्क () सिस्टम कॉल का उपयोग करना

इस कार्यक्रम में, हमने कांटा () का उपयोग किया है, यह एक नई चाइल्ड प्रोसेस बनाएगा। जब चाइल्ड प्रोसेस बनाया जाता है, तो पैरेंट प्रोसेस और चाइल्ड प्रोसेस दोनों अगले निर्देश (उसी प्रोग्राम काउंटर) की ओर इशारा करेंगे। इस तरह शेष निर्देश या सी स्टेटमेंट को प्रक्रिया के समय की कुल संख्या, यानी 2 . निष्पादित किया जाएगाएनसमय, जहां n फोर्क () सिस्टम कॉल की संख्या है।

तो जब कांटा() कॉल ऊपर के रूप में एक बार उपयोग किया जाता है (21= 2) हमारे पास हमारा आउटपुट 2 गुना होगा।

यहां जब कांटा () सिस्टम कॉल का उपयोग किया जाता है, तो आंतरिक संरचना इस तरह दिखेगी:

निम्नलिखित मामले पर विचार करें जिसमें कांटा () 4 बार प्रयोग किया जाता है:

कोड:

#शामिल
#शामिल
#शामिल

NSमुख्य()
{
कांटा();
कांटा();
कांटा();
कांटा();
printf ('फोर्क () सिस्टम कॉल का उपयोग करना');
वापसी 0;
}

आउटपुट:

Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call 

अब बनाई गई प्रक्रियाओं की कुल संख्या 2 . है4= 16 और हमारे पास हमारे प्रिंट स्टेटमेंट को 16 बार निष्पादित किया गया है।

उदाहरण 2: परीक्षण अगर कांटा () सफल रहा

निम्नलिखित उदाहरण में हमने फोर्क () द्वारा लौटाए गए मान (int) का परीक्षण करने के लिए निर्णय लेने के निर्माण का उपयोग किया है। और संबंधित संदेश प्रदर्शित होते हैं:

कोड:

#शामिल
#शामिल
#शामिल

NSमुख्य()
{
pid_t p;
पी=कांटा();
अगर(पी== -1)
{
printf ('फोर्क ()' को कॉल करते समय एक त्रुटि हुई);
}
अगर(पी==0)
{
printf ('हम बच्चे की प्रक्रिया में हैं');
}
अन्यथा
{
printf ('हम मूल प्रक्रिया में हैं');
}
वापसी 0;
}

आउटपुट:

हम मूल प्रक्रिया में हैं
हम बच्चे की प्रक्रिया में हैं

उपरोक्त उदाहरण में हमने pid_t प्रकार का उपयोग किया है जो फोर्क () के रिटर्न वैल्यू को स्टोर करेगा। कांटा() लाइन पर कहा जाता है:

पी=कांटा();

तो फोर्क() द्वारा लौटाया गया पूर्णांक मान पी में संग्रहीत किया जाता है और फिर पी की तुलना यह जांचने के लिए की जाती है कि हमारा कांटा() कॉल सफल था या नहीं।

जब फोर्क () कॉल का उपयोग किया जाता है और बच्चे को सफलतापूर्वक बनाया जाता है, तो चाइल्ड प्रोसेस की आईडी मूल प्रक्रिया में वापस आ जाएगी और 0 चाइल्ड प्रोसेस में वापस आ जाएगी। पेरेंट प्रक्रिया में चाइल्ड प्रोसेस की आईडी समान नहीं होगी चाइल्ड प्रोसेस में ही चाइल्ड प्रोसेस की आईडी। चाइल्ड प्रोसेस में चाइल्ड प्रोसेस की आईडी 0 होगी।

इस ट्यूटोरियल के साथ आप देख सकते हैं कि लिनक्स में फोर्क सिस्टम कॉल के साथ कैसे शुरुआत करें।