2015-12-14 16 views
8

यूनिक्स पाइप (|) है जो किसी प्रक्रिया के आउटपुट को पाइपलाइन करता है और पाइपलाइन को "पाइप (int pipefd [2])" का उपयोग करके सी में इस्तेमाल किया जाता है, जिसमें इंटर प्रोसेस संचार के लिए इस्तेमाल किया जाता है?यूनिक्स पाइप (|) और पाइप हम सी में "पाइप (int pipefd [2])" का उपयोग कर बनाते हैं?

उत्तर

5

वे pipe(2) पर कॉल करने के अर्थ में काफी समान नहीं हैं, खोल के | के बराबर फ़ंक्शन को लागू करने के लिए पर्याप्त नहीं है।

pipe(2) दो फ़ाइल वर्णनकर्ता (अंत पढ़ सकते हैं और अंत बारे में) पैदा करता है। लेकिन आपको | कार्यक्षमता को लागू करने के लिए उससे अधिक करने की आवश्यकता है।

एक पाइप बनाने की विशिष्ट अनुक्रम इस प्रकार है:

1) एक पढ़ा अंत और एक लिखने अंत pipe(2) का उपयोग कर बनाएँ।

2) एक बच्चे की प्रक्रिया fork() का उपयोग कर बनाएँ।

3) जनक और बच्चे प्रक्रियाओं dup2() का उपयोग कर फ़ाइल वर्णनकर्ता नकल।

4) दोनों प्रक्रियाओं, प्रत्येक पाइप (पाइप कि प्रत्येक प्रक्रिया का उपयोग नहीं करते के एक छोर) के एक छोर बंद कर देता है।

5) एक पाइप के लिए लिखते हैं और पाइप से अन्य पढ़ता है।

यह दिखाने के लिए सरल उदाहरण पर विचार करें। इसमें आप एक फ़ाइल नाम को तर्क के रूप में पास करते हैं और मूल प्रक्रिया उस फ़ाइल को "greps" करती है जो बच्चे द्वारा cat है।

#include <stdio.h> 
#include <unistd.h> 

int main(int argc, char **argv) 
{ 
    int pipefd[2]; 
    int pid; 

    char *cat_args[] = {"cat", argv[1], NULL}; 
    char *grep_args[] = {"grep", "search_word", NULL}; 

    pipe(pipefd); 
    pid = fork(); 

    if (pid != 0) 
    { 
     dup2(pipefd[0], 0); 
     close(pipefd[1]); 
     execvp("grep", grep_args); 
    } 
    else 
    { 
     dup2(pipefd[1], 1); 
     close(pipefd[0]); 
     execvp("cat", cat_args); 
    } 
} 

यह खोल पर

cat file | grep search_word 

कर के बराबर है।

+0

डुप्लिकेट क्यों बनाए गए हैं? क्या हम डुप्लिकेट किए बिना डेटा लिख ​​और पढ़ नहीं सकते? –

+1

यह सभी माता-पिता-बाल प्रक्रिया संचार में कड़ाई से जरूरी नहीं है ('dup2()')। आप माता-पिता और बच्चे भी सीधे संवाद कर सकते हैं। उदाहरण के लिए, माता-पिता पाइप के लिखने के अंत में 'लिखना (2)' कर सकते हैं और बच्चे पढ़ने के अंत से '(2) 'पढ़ सकते हैं। –

+0

@PsAkshay क्योंकि निष्पादित grep और cat केवल 0 और 1 से पढ़ते/लिखते हैं, न कि पाइपफ़ेड। –

6

शैल पाइप |pipe(2) और dup2(2) सिस्टम कॉल का उपयोग करके कार्यान्वित किया गया है।

Unix Pipes देखें।

0

pipe(2) syscall | ऑपरेटर

| साथ पाइपिंग के लिए गोले द्वारा प्रयोग किया जाता खोल के कार्यान्वयन, यह intenally pipe() syscall का उपयोग करता है।