dup2复制标准输出无法正常工作.
将标准输出/标准错误关闭,再 "重定向" 到 pipe()
打开的描述符.
遇到一个问题,pipe()
之后, 标准输出不起作用.
错误代码:
int pipefd[2];
// ...
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
pipe(pipefd);
dup2(pipefd[1], STDOUT_FILENO);
write(STDOUT_FILENO, "hello", 5); // 没起作用
// ...
原因是 close()
执行过早,导致描述符 0
, 1
, 2
空闲出来了, 在 pipe()
中分配完了.
另一个问题
衍生出另一个问题, printf()
等函数未能正常打印出来. 这是这些函数使用的 FILE*
版(stdin
, stdout
, stderr
) 的流, 目前 未有找到资料应该如何重新打开这些流.
有个 fdopen()
可能可以试下,
fclose(stdout);
stdout = fdopen(STDOUT_FILENO, "w");
// ...
这方法未验证, 也无资料可确证.
而且 fdopen
的文档有说明需要特性测试宏.(Feature Test Macro Requirements for glibc),
不清楚是否足够"通用".
参考
- [1] "How to close stdout and stderr in C?" https://stackoverflow.com/questions/4972994/how-to-close-stdout-and-stderr-in-c
- [2] man:pipe(2)
- [3] man:fdopen(3)