2011-10-23 18 views
5

मेरे पास दो बार फोर्किंग की मुख्य प्रक्रिया है और इस प्रकार दो बच्चे पैदा कर रहे हैं। दोनों बच्चों को इस तरह एक दूसरे के साथ पाइप किया जाता है:अंतिम बच्चा फोर्क नहीं होगा

ls | more 

अब समस्या यह है कि दूसरा बच्चा कभी मर नहीं जाता है। ऐसा क्यों है? पाइप में आखिरी बच्चा वास्तव में कब मरता है?

एक को हटाने() कॉल ls | more के अपेक्षित परिणाम दिखाता है लेकिन कुछ और अजीब व्यवहार (अटक टर्मिनल आदि) देता है। कि यह वास्तव में more कि मर नहीं है ps axw साथ

int main(){ 
    printf("[%d] main\n", getpid()); 
    int pip[2], i; 
    pipe(pip); 

    /* CHILDREN*/ 
    for (i=0; i<2; i++){ 
    if (fork()==0){ 

     /* First child */ 
     if (i==0){ 
     printf("[%d] child1\n", getpid()); 
     close(1); dup(pip[1]); 
     close(pip[0]); 
     execlp("ls", "ls", NULL);} 

     /* Second child */ 
     if (i==1){ 
     printf("[%d] child2\n", getpid()); 
     close(0); dup(pip[0]); 
     close(pip[1]); 
     execlp("more", "more", NULL);} 
    } 
    } 
    wait(NULL); // wait for first child 
    wait(NULL); // wait for second child 
    return 0; 
} 
+1

इस प्रश्न का शीर्षक बहुत हिंसक लगता है। – Marlon

+0

@ मार्लोन हाहा ने इसे अब तक ऐसा नहीं देखा! – Pithikos

उत्तर

6

पाइप के पढ़ने के अंत एक EOF निशान नहीं मिलेगा जब तक कि अपने सभी उपयोगकर्ताओं द्वारा लिखने का अंत बंद नहीं हो जाता है। दोनों बच्चों के माता-पिता के पास अभी भी पाइप के दोनों सिरे हैं, इसलिए more में ईओएफ नहीं दिखता है (read() से 0 की वापसी), और अधिक इनपुट की प्रतीक्षा करता रहता है।

+0

धन्यवाद, यह किया था! – Pithikos

0

की जांच:

यहाँ मेरी कोड है। फिर wait के लिए मैन पेज पढ़ें। wait के लिए लौटाई गई स्थिति देखें।

(संकेत: क्या एक 'ज़ोंबी' प्रक्रिया का कारण बनता है पर देखने मुझे नहीं लगता कि इंतजार कर रहे हैं कि तुम क्या लगता है कि वे कर रहे हैं।।)

+0

ने "ps aux | grep more" के साथ भी ऐसा किया है। मैं दूसरा बच्चा जीवित देख सकता हूं और प्रॉम्प्ट बस लटकता है (बच्चे की प्रतीक्षा कर रहा है)। – Pithikos