【发布时间】:2021-09-09 09:40:26
【问题描述】:
我想将子进程的输出通过管道传输到父进程的stdout。我知道还有其他方法可以做到这一点,但为什么管道的读取端不能复制到stdout? 为什么程序不打印写入管道写入端的内容?
在这里,我有一个我正在尝试做的最小示例(没有任何子流程)。我希望在运行时在输出中看到test,但程序什么也没输出。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void) {
int fds[2];
if(pipe(fds) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
if(write(fds[1], "test", 5) == -1) {
perror("write");
exit(EXIT_FAILURE);
}
if(dup2(fds[0], STDOUT_FILENO) == -1) {
perror("dup2");
exit(EXIT_FAILURE);
}
return 0;
}
【问题讨论】:
-
我认为您需要在
dup2之前close(STDOUT_FILENO)。您还应该检查dup2是否失败(if dup2(fds[0], STDOUT_FILENO) == -1) {handle error})。 -
STDOUT_FILENO由子(分叉?)进程继承。为什么不直接给孩子写STDOUT_FILENO呢? -
@Jabberwocky dup2() 自动关闭 STDOUT_FILENO。如果我使用 dup(),那将是真的。
-
@tstanisl 这不是如何修复的问题,我更想知道为什么这是不可能的。
-
所以问题是关于将两个现有文件描述符加入管道?