2012-11-10 118 views
0

我很初學linux,但是我設法做我自己的shell。現在是時候添加管道了。 (這就是功課所說的)。任何人都可以解釋我多一點怎麼做?我知道理論上它應該這樣工作。使用c編程的Linux管道。通過管道重定向輸入/輸出。自己的外殼

unsigned char* child_results; //buffer to save results from child processes 

for (int i = 0; i < 2; i++) { 
    pid = fork(); 

    if (pid == 0) { 
     //if it's the first process to launch, close the read end of the pipe 
     //otherwise read what the parent writes to the pipe and then close the 
     //read end of the pipe 

     //call execvp() 
    } 
    else { 
     //if you've launched the first process, close the write end of the pipe 
     //otherwise write the contents of child_result to the child process 
     //and then close the write end of the pipe 

     //read from the child's pipe what it processed 

     //save the results in the child_results buffer 

     wait(NULL); //wait for the child to finish 
    } 
} 

但是,我不能得到它的工作。我整天都在這樣做,仍然沒有。我明白這個主意,但我無法得到它的工作。有人能幫助我嗎?這裏是我的管道部分的代碼:

for (int i = 0; i <= pipeline_count; i++) { 
    int pdesc[2]; 
    // creating pipe 
    pipe(pdesc); 
    int b = fork(); 
    // child 
    if (b == 0) { 
     // 1st pipeline 
     if (i == 0) {  
      //<?>    
     } 

     // last pipeline 
     if (i == pipeline_count) {        
      //<?> 
     } 

     // inside pipeline 
     if (i > 0 && i < pipeline_count) { 
      //<?> 
     } 
     execvp(array[0], array); 
    } 
    else { 
     // parent 
     //<?> 
     wait(NULL);   
    } 
}  

,這裏是一個shell命令的例子

ls -al | tr a-z A-Z 

感謝

+0

閱讀http://advancedlinuxprogramming.com/ –

回答

2

必須關閉對孩子的輸入流,並與dup管道複製爲那個頻道。父母對管道的另一側也一樣。事情是這樣的:

b = fork(); 
if (b == 0) { 
    /* Close stdin, and duplicate the input side of the pipe over stdin */ 
    dup2(0, pdesc[0]); 
    execlp(...); 
} 
else { 
    /* Close stdout, and duplicate the output side of the pipe over stdout */ 
    dup2(1, pdesc[1]); 
    execlp(...); 
} 
... 

我展示瞭如何做到這一點上兩個進程的情況下,但你可以得到的總體思路,並配合其他情形。

希望有幫助!

+0

爲什麼要在父進程和子進程中運行execlp?這不會阻止我的計劃嗎? – Patryk

+1

不!當然!這只是一個示例代碼!我只是簡單地舉例說明如何使用dup2函數。在你的情況下,你必須在第一個孩子的輸入中調用dup2,在最後一個孩子的輸出上調用dup2,在其他孩子的過程中調用雙方。 –

+0

如果你只告訴我,如何讀出管道到字符數組,並從字符數組寫入管道,我肯定會這樣做:P! – Patryk