c - प्रतीक्षा के बिना फोरिंग



switch-statement fork (1)

मैं अनिश्चित हूँ अगर मैं इसके बारे में सही तरीके से जा रहा हूं, तो मैं कुल 7 प्रक्रियाओं को बनाने की कोशिश कर रहा हूं ...

void err_sys(const char* x)
{
   perror(x);
   exit(1);
}


for(i = 1; i < 7; i++){
  switch(parent = fork()){
      case -1:
         err_sys("fork error");
      case 0:       //child
         printf("I'm the child, number %d(%d)\n", i, getpid());
         break;
      default:      //parent
         printf("I'm the parent(%d)\n", getpid());
         break;
  }
    if(parent)
       break;        //loop break
}

जब मैं इसे ठेला के साथ चलाता हूँ | बिल्ली> फ़ाइल मुझे "मैं माता-पिता हूं" का 6 आउटपुट मिलता है, इसके बाद प्रत्येक बच्चे के विभिन्न प्रकार के होते हैं हालांकि, अद्वितीय पाइड्स के साथ 6 बच्चे हैं। अन्य माता पिता के बच्चे, पहले मैच के अलावा एक बच्चे को pids। क्या यह सिर्फ कुछ समस्या है जो उत्पादन के साथ आती है?


आपका कोड एक प्राथमिकता गलत नहीं है; यह करता है कि यह क्या करता है मुद्दा 'ऐसा करता है जो आप करना चाहते हैं', और यह स्पष्ट नहीं है क्योंकि आपने स्पष्ट रूप से यह नहीं बताया है कि आप क्या करने का प्रयास कर रहे हैं।

एक कारण आपको 6 प्रक्रिया मिलती है कि आपके पास एक पाश है:

for (i = 1; i < 7; i++)

यह 1, 2, 3, 4, 5, 6 और स्टॉप की गणना करता है। आपको दो दो मुहावरों में से एक का उपयोग करने की आवश्यकता है:

for (i = 0; i < 7; i++)      // Idiomatic C
for (i = 1; i <= 7; i++)     // Less idiomatic C

यह मानते हुए कि err_sys() वापस नहीं बुलाया जाता है (यदि ऐसा होता है, तो आपको एक break; बाद), फिर:

  1. प्रक्रिया कांटे यदि कांका विफल रहता है, तो प्रक्रिया err_sys() द्वारा बाहर निकलती है
  2. यदि यह प्रक्रिया बच्चे है (इसलिए गलत नामित चर parent को 0 पर सेट किया गया है), तो कोड "मैं बच्चा है" प्रिंट करता है और फिर स्विच को छोड़ देता है, और फिर से लूप के आसपास फिर से चला जाता है।
  3. अगर यह प्रक्रिया माता-पिता है (इसलिए गलत नामित चर वाली parent को गैर-शून्य मान पर सेट किया गया है), यह "मैं अभिभावक हूं" प्रिंट करता है और फिर स्विच और लूप को छोड़ देता है

पहले कांटा से केवल बच्चे को लूप को फिर से चालू करना पड़ता है। हालांकि, आखिरी को छोड़कर प्रत्येक बच्चे को स्वयं को लूप के अगले चलने पर माता-पिता के रूप में पहचानना पड़ता है।

बुफोर्ड आई / ओ

ध्यान दें कि बफर किए गए I / O चीजों की जटिलताएं यदि प्रोग्राम का आउटपुट टर्मिनल पर लिखा जाता है, तो आपको डिफ़ॉल्ट रूप से लाइन बफ़र आउटपुट मिलेगा। प्रत्येक नई लाइन के कारण डेटा को टर्मिनल पर लिखा जाना है। हालांकि, जब आउटपुट पाइप पर जाता है, तो यह पूरी तरह बफर है; बफर पूर्ण होने पर डेटा केवल टर्मिनल को लिखा जाता है, या प्रक्रिया बाहर निकल रही है (या किसी अन्य कारण के लिए मानक आउटपुट बंद कर देती है)। इस प्रकार, जब उत्पादन एक पाइप पर जाता है, तो पहले बच्चे के पास सिर्फ अपने आपरेशनों का उत्पादन होता है, लेकिन दूसरे बच्चे के आंकड़े मुद्रित होते हैं, लेकिन अपने बच्चे के बफ़र के साथ-साथ इसके बारे में जो भी लिखा जाता है, उसमें फ्लेवर नहीं होता। तीसरे बच्चे के पास 3 प्रोसेस की आउटपुट है, और इसी तरह।

आप प्रिंट स्टेटमेंट के बाद (या switch के अंत के बाद, if पहले fflush(0) या fflush(stdout) fflush(0) जोड़ सकते हैं और देखें कि यह किस तरह का अंतर है। आप पाइप को रीडायरेक्ट किए बिना भी कोड चला सकते हैं और देख सकते हैं कि एक अंतर क्या है जो बनाता है।





wait