这个问题源于我的实施尝试 http://www.microhowto.info/howto/capture_the_output_of_a_child_process_in_c.html 和 https://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,它直接输出到终端并工作。