2015-11-21 108 views
1

我試圖使用execvp來運行grep。這一計劃背後的思想是fork一個子進程,使孩子sort一個名爲sortfile,然後父進程應在有序輸出使用grep文件。以下是我的代碼。Grep永不退貨

#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

#define READ 0 
#define WRITE 1 

int main(int argc, char* argv) { 
    pid_t cpid; 
    int status; 
    int pipefd[2]; 
    pipe(pipefd); 
    char* args[] = {"grep", "f", NULL}; 

    cpid = fork(); 
    if(cpid == 0) { 
     dup2(pipefd[READ], READ); 
     dup2(pipefd[WRITE], WRITE); 
     close(pipefd[READ]); 
     close(pipefd[WRITE]); 

     if(execlp("sort", "sort", "sortfile", NULL) == -1) { 
      perror("sort"); 
     }  
    } else { 
     dup2(pipefd[READ], READ); 
     dup2(pipefd[WRITE], WRITE); 
     close(pipefd[READ]); 
     close(pipefd[WRITE]); 
     wait(&status); 

     if(execvp("grep", args) == -1) { 
      perror("grep"); 
     } 

    } 
} 

我使用DUP2複製管道的文件描述符到標準輸入和標準輸出,然後關閉未使用的文件描述符。即使這樣的方案無法返回,這使我相信它試圖從其他沒有進行寫入,從而阻斷過程中的文件進行讀取。我完全失去了這一點,可以使用一些提示。 sortfile的內容是a b f s g

+0

我的上帝,我甚至沒有想到這一點。我修復了'dup2'調用,它正在工作。如果您將其作爲答案發布,我會接受它。 –

回答

2

dup2調用對於父母和子女都是相同的。這是不對的。孩子(排序)需要寫入父母(grep)讀取的管道。