2010-09-04 12 views
18

के लिए डुप्ली 2 का उपयोग करना निम्न आदेश करने के लिए मैं dup2 का उपयोग कैसे करूं?पाइपिंग

ls -al | grep alpha | more 

उत्तर

2

आप pipe(2,3p) का भी उपयोग करेंगे। पाइप, कांटा, पाइप के उचित छोर को बच्चे के एफडी 0 या एफडी 1 पर डुप्लिकेट करें, फिर निष्पादित करें।

25

पहले दो आदेशों के साथ एक छोटा सा उदाहरण। आपको पाइप() फ़ंक्शन के साथ एक पाइप बनाने की आवश्यकता है जो gres और g के बीच ls और grep और अन्य पाइप के बीच जाएगी। क्या डुप्ली 2 एक फ़ाइल डिस्क्रिप्टर को दूसरे में कॉपी करता है। पाइप [0] के इनपुट में एफडी [0] में इनपुट को जोड़कर पाइप काम करता है। आपको पाइप और डुप्ली 2 के मैन पेज पढ़ना चाहिए। यदि आपके पास कुछ अन्य संदेह हैं तो मैं बाद में उदाहरण को आजमा सकता हूं और सरल बना सकता हूं।

#include <sys/types.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <string.h> 
#include <errno.h> 

#define READ_END 0 
#define WRITE_END 1 

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

    pipe(fd); 
    pid = fork(); 

    if(pid==0) 
    { 
     printf("i'm the child used for ls \n"); 
     dup2(fd[WRITE_END], STDOUT_FILENO); 
     close(fd[WRITE_END]); 
     execlp("ls", "ls", "-al", NULL); 
    } 
    else 
    { 
     pid=fork(); 

     if(pid==0) 
     { 
      printf("i'm in the second child, which will be used to run grep\n"); 
      dup2(fd[READ_END], STDIN_FILENO); 
      close(fd[READ_END]); 
      execlp("grep", "grep", "alpha",NULL); 
     } 
    } 

    return 0; 
} 
+0

यह केवल एक कांटा() का उपयोग कर और या तो ls या ग्रेप के लिए मूल प्रक्रिया का उपयोग कर, लेकिन अच्छी तरह से मैं तुम्हें करने के लिए कि छोड़ देंगे द्वारा सुधार किया जा सकता: पी – theprole

+0

कैसे करना चाहिए हम पाइप के ग्रेप का उत्पादन अधिक। यह सिर्फ दो प्रक्रियाओं को सही ढंग से पाइप कर रहा है? – CanCeylan

+1

क्या आप grep के लिए WRITE_END को बंद नहीं करना चाहिए और RES_END को ls के लिए बंद नहीं करना चाहिए (आपने जो किया उसके विपरीत)? –

संबंधित मुद्दे