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),
不清楚是否足够"通用".

参考

posted @ 2021-10-10 14:16  陈tseesing  阅读(135)  评论(0编辑  收藏  举报