2014-02-16 159 views
1

在這種格式給出的命令:管道問題(斷管)

cat < inputfile.txt | tee outputfile.txt 

我想有inputfile.txt寫入管道,然後讓outputfile.txt從管道中讀取,和我已經寫以下類函數可以這樣做:

void piperead(char** input, int* fd, int start) { 

    dup2(fd[0], 0); 
    close(fd[1]); 
    execl("usr/bin/tee", "usr/bin/tee", input[start + 1], NULL); 

} 

void pipewrite(char** input, int* fd, int start, int end) { 

    dup2(fd[1], 1); 
    close(fd[0]); 
    execl("usr/bin/cat", "usr/bin/tee", input[start + 2], NULL); 

} 

void dopiping(char** input, int start, int end) { 

    int fd[2]; 
    if (pipe(fd) == -1) { 
     cout << "Error: Pipe failed." << endl; 
     exit(1); 
    } 
    int pid = fork(); 
    switch(pid = fork()) {   
     case 0: 
      piperead(input, fd, start, end); 
     default: 
      pipewrite(input, fd, end + 1);   
     case -1: 
      exit(1); 
    } 


} 

我已經轉換命令到c_strings的陣列(讓我們稱之爲cmdarray),然後我請dopiping(cmdarray,0,3)。程序進入線路的那一刻:

dup2(fd[1], 1) 

程序終止,因爲程序收到了SIGPIPE。爲什麼我的管子壞了,我該如何解決這個問題?

+0

您確定您的意思是「usr/bin/cat」而不是「/ usr/bin/cat」嗎? –

+0

此外,您的程序有一個邏輯錯誤:在執行成功的'exec'調用後它不會繼續。你忘了「叉」嗎? –

+0

是的,我打算做「/ usr/......」。我是否使用fork()以避免邏輯錯誤? –

回答

1

所以看着這個邏輯

  • SIGPIPE被傳遞到一個過程,它寫()來關閉或管道/插座。
  • 因此,您創建的管道的讀取面必須已關閉。
  • 在您執行完dup2()
  • 後,您的密碼不會關閉fd[0]因此看起來子進程正在退出。
  • 我猜想,無論是execl()失敗 - 你應該嘗試指定「的/ usr/bin中/三通」(完整路徑而不是相對路徑)
  • 或您的tee失敗 - 需要確保input[start+1]指向以空字符結尾的字符串表示有效的文件路徑。