Grep永远不会回来

时间:2015-11-21 19:18:32

标签: c linux grep exec

我正在尝试使用execvp来运行grep。这个程序背后的想法是分叉子进程,使子sort成为一个名为sortfile的文件,然后父进程应在排序的输出上使用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将管道的文件描述符复制到stdin和stdout,然后关闭未使用的文件描述符。即使这样做,程序也永远不会返回,这使我相信它试图从没有被写入的文件描述符中读取,从而阻止了该过程。我完全迷失了,可以使用一些提示。 sortfile的内容为a b f s g

1 个答案:

答案 0 :(得分:2)

dup2次呼叫对于父母和孩子都是相同的。那不是对的。子(sort)需要写入父(grep)读取的管道。