2013-05-05 171 views
2

我在學習管道,並且出現了問題。我想我的程序工作如下:
grep [word to find] [file to search] | grep -i [without word] | wc -l 它編譯和工作沒有錯誤,但它沒有輸出(至少不是我想要它做的stdout)。奇怪的是,當我嘗試在最後一個fork中打印它時,它在stdin上打印它。我不改變這個叉或在parrent過程中的標準輸出,所以它對我來說似乎很奇怪。我試圖關閉未使用的管道並刷新標準輸出(這是否仍然在這裏?),但是可能還有更多的事情要做。進程通信中的管道標準輸入/標準輸出。

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

void help() { 
     printf("Usage of the program:\n" 
       "\t./alagrep [fileToSearch] [wordToFind] [wordToExpel]\n"); 
} 


int main(int argc, char *argv[]) { 

     if(argc != 4) { 
       help(); 
       exit(EXIT_FAILURE); 
     } 

     int fd[2]; 
     if(pipe(fd) != 0) { 
       printf("Error while opening a pipe.\n"); 
       exit(EXIT_FAILURE); 
     } 

     pid_t pid; 
     if((pid = fork()) == -1) { 
       printf("Error while forking.\n"); 
       exit(EXIT_FAILURE); 
     } else if(pid == 0) { 
       close(fd[0]); 
       if(dup2(fd[1],STDOUT_FILENO) < 0) { 
         printf("Cannot duplicate stdout.\n"); 
         _exit(EXIT_FAILURE); 
       } 
       close(fd[1]); 
       execl("/bin/grep","grep",argv[2],argv[1],NULL); 
       fflush(stdout); 
     } 

     close(fd[1]); 
     int fd1[2]; 
     if(pipe(fd1) != 0) { 
       printf("Error while opening a pipe.\n"); 
       exit(EXIT_FAILURE); 
     } 

     if((pid = fork()) == -1) { 
       printf("Error while forking.\n"); 
       exit(EXIT_FAILURE); 
     } else if(pid == 0) { 
       close(fd1[0]); 
       if(dup2(fd[0],STDIN_FILENO) < 0) { 
         printf("Cannot duplicate stdin.\n"); 
         _exit(EXIT_FAILURE); 
       } 
       if(dup2(fd1[1],STDOUT_FILENO) < 0) { 
         printf("Cannot duplicate stdout.\n"); 
         _exit(EXIT_FAILURE); 
       } 
       close(fd[0]); 
       close(fd1[1]); 
       execl("/bin/grep","grep","-i",argv[3],NULL); 
       fflush(stdout); 
     } 

     close(fd[0]); 
     close(fd1[1]); 

     if((pid = fork()) == -1) { 
       printf("Error while forking.\n"); 
       exit(EXIT_FAILURE); 
     } else if(pid == 0) { 
       close(fd1[1]); 
       if(dup2(fd1[0],STDIN_FILENO) < 0) { 
         printf("Cannot duplicate stdin.\n"); 
         _exit(EXIT_FAILURE); 
       } 
       close(fd1[0]); 
       execl("/bin/wc","wc","-l",NULL); 
       fflush(stdout); 
     } 

     close(fd1[0]); 
     return 0; 
} 

回答

1

我爲什麼用execlp代替execl幫助BU也不太清楚。可能與execl進程無法找到我的文本文件。 Althoug我給了他路徑。所以我猜execl正在其他目錄中工作。

相關問題