2017-03-19 19 views
0

我當前的程序使用管道和叉子實現管道「cat/etc/passwd | cut -f1 -d:」。
我想擴展它來實現更長的管道「cat/etc/passwd | cut -f1 -d:| sort」。使用三個命令擴展程序來實現管道

有人可以解釋我應該怎麼做呢?我試圖沒有成功,但知道我需要實現另一個叉子和管道來擴展管道。

目前的程序代碼如下:

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

int main(void) 
    { 
    int pfds[2]; 

    pipe(pfds); 

    if(!fork()) {  /*only use child process*/ 
     close(1); /*close normal stdout*/ 
     dup(pfds[1]); /*make stdout same as pfds[1]*/ 
     close(pfds[0]); /*Dont need this (stdin)*/ 
     execlp("/bin/cat","cat", "/etc/passwd", NULL); 
    } 
    else{ 
     close(0); /*close normal stdin*/ 
     dup(pfds[0]); /*make stdin same as pfds[0]*/ 
     close(pfds[1]); /*we dont need this (stdout)*/ 
     execlp("/usr/bin/cut","cut", "-f1","-d:", NULL); 


    } 

    int pfds2[2]; 
    pipe(pfds2); 

    if(!fork()){ 
     dup(pfds2[1]); 
     close(pfds2[0]); 
     execlp("/usr/bin/sort", "sort", NULL); 

    } 
    else{ 
     close(pfds2[1]); 
    } 


return 0; 
} 
+0

請顯示您的嘗試。 –

+0

@ n.m。剛剛更新了它。 – Ryan

回答

0

您需要從管道,而不是正面的後端開始。

試着做一個fork和exec。叉將是剪切,執行將是排序:

fork -- exec -- sort 
    | 
fork -- exec -- cut 
    | 
no fork -- exec -- cat