Pipe() - 父进程中的read-end保持为空

时间:2017-03-10 19:39:56

标签: c++ ubuntu pipe fork posix

这个问题源于我的实施尝试 http://www.microhowto.info/howto/capture_the_output_of_a_child_process_in_c.htmlhttps://linux.die.net/man/2/pipe

我正在写一个shell程序;目的是,它最终可以执行命令并将它们传递给另一个程序。因此,我直接需要子进程的stdout,而不是输出到终端。我试图使用上面的指南,但我有一个问题:管道总是空的。它只是不起作用。我完全不知道为什么。这是我的代码:

int pipefd[2];
    pid_t pid;
    pid = fork();
    char buf;
    const char* arg = "/bin/ls";
    char *args[] = {"/bin/ls", (char *) 0};
    if (pipe(pipefd) == -1) {
        perror("pipe");
        exit(EXIT_FAILURE);
    }

    if(pid<0) {
        std::cout << "Fork() failed!." << std::endl;
        exit(EXIT_FAILURE);
    } else if (pid == 0) {  //According to everything I could find on the internet, pipe should work.
        dup2(pipefd[1], STDOUT_FILENO); // It does not. I don't know why.
        close(pipefd[1]);
        close(pipefd[0]);
        execv(arg, args);
        std::cout << "Child Error! " << errno << std::endl;
        perror("execv");
        exit(EXIT_FAILURE);
    } else {
        close(pipefd[1]);
        wait(NULL);
        while (read(pipefd[0], &buf, 1) > 0){
            write(STDOUT_FILENO, &buf, 1);
        }
        write(STDOUT_FILENO, "\n", 1);
        close(pipefd[0]);
    }

我在使用Ubuntu 15.04的笔记本电脑上 此外,如果我在一个进程内写入/读取,则管道可以工作。 编辑:此外,execv确实有效 - 如果我删除dup2,它直接输出到终端并工作。

0 个答案:

没有答案