2015-11-21 3 views
1

Я пытаюсь использовать execvp для запуска grep. Мысль, стоящая за этой программой, заключается в том, чтобы развить дочерний процесс, сделать дочерний файл 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).

Смежные вопросы