【发布时间】:2016-07-02 03:12:43
【问题描述】:
请看一下这个示例代码,它使用非常成熟的编程模式将stdout 重定向到管道。
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int fd[2];
pipe(fd);
pid_t pid = fork();
if (pid == 0) {
close(fd[0]);
dup2(fd[1], 1);
printf("A string");
_exit(0);
}
close(fd[1]);
char text[1000];
size_t size;
int p = 0;
while ((size = read(fd[0], text+p, 1)) == 1) {
p++;
}
close(fd[0]);
text[p] = '\0';
printf("%s", text);
return 0;
}
目前的代码不工作。正如@kaylum 在评论中正确建议的那样,在子进程中调用exit 而不是_exit 会使代码正常工作。
【问题讨论】:
-
close(fd[1])不,close(fd[0])也许?在您的代码中 -
@gsamaras 不是
fd[0]管道的读取端,我应该在父进程中使用它从管道中读取? -
复制后你可以
close(fd[1]);,这对我来说似乎更干净一些,但我怀疑这会改变你程序的行为。 -
致电
exit而不是_exit。 -
_exit可能会或可能不会刷新标准 IO 流(它取决于实现)。exit保证刷新标准 IO 流。