1

我有两组代码都试图执行类似ls|grep pip 一个有效的和一个无效的。

工作代码创建了 2 个子进程,每个子进程使用一个子进程来执行一个命令,另一个简单地尝试通过创建一个子进程来执行此操作。即在说孩子和父母中的grep中执行ls。这似乎不起作用。而且我似乎也没有任何错误。

有人可以告诉我问题是什么吗?它为什么存在?

不工作:

void runpipe()
{
    pid_t childpid;
    int fd[2];
    pipe(fd);
    int saved_stdout;
    int saved_stdin;
    saved_stdout=dup(STDOUT_FILENO);
    saved_stdin=dup(STDIN_FILENO);
    if((childpid=fork())==0)
    {
            dup2(fd[WRITE_END],STDOUT_FILENO);
            close(fd[WRITE_END]);
            execlp("/bin/ls","ls command","-l",NULL);

            dup2(STDOUT_FILENO,fd[1]);
            _exit(0);
    }
    else if(childpid>0)
    {

            dup2(saved_stdout,STDOUT_FILENO);
            dup2(fd[READ_END],STDIN_FILENO);
            close(fd[READ_END]);
            execlp("/bin/grep","grep","pip",NULL);
            wait();
            _exit(0);

    }
    else
    {
            printf("ERROR!\n");
    }
}

以下是代码:

在职的:

    int runpipe(){
    pid_t pid;
    int fd[2];

    pipe(fd);
    int i;
    pid=fork();

    if (pid==0) {

            printf("i'm the child used for ls \n");
            dup2(fd[WRITE_END], STDOUT_FILENO);
            close(fd[READ_END]);
            execlp("ls", "ls", "-al", NULL);
            _exit(0);
    } else {
            pid=fork();

            if (pid==0) {
                    printf("i'm in the second child, which will be used to grep\n");
                    dup2(fd[READ_END], STDIN_FILENO);
                    close(fd[WRITE_END]);
                    execlp("grep", "grep","pip",NULL);
            }
            else wait();
    }
    return 0;
}

4

1 回答 1

0

在执行 grep 之前,父级需要关闭管道的写入端。出于某种原因,您的具有两个孩子的代码会关闭该文件描述符,但不会在只有一个孩子的代码中。您将打开几个描述符,但管道上的写入端是重要的。读取器(exec'd grep)将在管道写入端的所有副本都关闭之前完成。由于未能关闭它,grep 是保持它打开的那个,因此 grep 永远不会终止,而只是等待更多数据。

于 2012-09-13T22:03:28.880 回答