2014-10-09 87 views
1

我想寫一個測試程序,它使用管道在3個linux命令之間傳遞信息。相當於「ls | wc | wc」的bash。以下是我的代碼 我得到的唯一輸出是。該程序停留在那裏而不退出。管道沒有得到EOF

./a.out starting main creating pipe first

在bash的預期結果是一樣的東西

ls | wc | wc 1 3 24 編輯:在運行strace的我看得出來,主要工藝是wait4,兩個衛生間進程停留在讀(0)。正如我猜測的那樣,因爲wc沒有獲得EOF。爲什麼這樣?能有人幫我找出問題嗎?

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

int p[2]; 
int p1[2]; 
int r=0; 


int fork1(void) 
{ 
    int pid; 
    pid = fork(); 
    if(pid == -1) { 
     perror("fork"); 
     exit(1); 
    } 
    return pid; 
} 
int main (int argc, char const* argv[]) 
{ 
    printf("starting main\n"); 
    printf("creating pipe first\n"); 
    if(pipe(p)<0) { 
     perror("pipe"); 
     exit(1); 
    } 
    if(pipe(p1)<0) { 
     perror("pipe"); 
     exit(1); 
    } 
    if(fork1()==0) { 
     //send output to p 
     close(1); 
     dup(p[1]); 
     close(p[0]); close(p[1]); 

     execlp("ls","ls",NULL); 
     exit(0); 

    } 
    if(fork1() == 0) { 
     close(1);//write to p1 
     dup(p1[1]); 
     close(p1[1]); close(p1[0]); 

     close(0);//read from p 
     dup(p[0]); 
     close(p[0]); close(p[1]); 
     execlp("wc","wc",NULL); 
     exit(0); 
    } 
    if(fork1() == 0) 
    { 

     close(0);//read from p1 
     dup(p1[0]); 
     close(p1[0]); close(p1[1]); 
     execlp("wc","wc",NULL); 
     exit(0); 
    } 
    close(p[0]); close(p[1]); close(p1[0]); close(p1[1]); 
    wait(&r);wait(&r);wait(&r); 
    printf("parent done\n"); 

    return 0; 
} 
+3

如何在系統上聲明'wait()'?在我的,我必須'#include ',然後它不會編譯,因爲wait()接受一個參數,你沒有提供。這是未定義的行爲。用-Wall或編譯器的等價物編譯以啓用警告。 – 2014-10-09 08:08:20

+0

我包括#include #include 文件,它給了我一個錯誤。我用等待的參數修改了代碼。 – woodstok 2014-10-09 08:12:31

+0

只需在strace -f下運行它,看看哪個進程正在做什麼。 – Useless 2014-10-09 08:21:19

回答

2

問題是我沒有關閉每個分支中的所有管道。 我不得不在所有三個叉子和父母中關閉p,p1。一旦我添加這些,它是工作

+0

謝謝,來自陌生人的未來。你救了我。 – DonutGaz 2017-02-24 22:01:05