我可以将stdout重定向到两个子进程吗?

时间:2017-02-07 15:33:15

标签: c++ linux fork

在C / C ++中,您通过dup2(...,STDERR_FILENO)[1]从子进程读取stdout。我真的不明白dup2的作用;我能同时为两个同时运行的子进程执行两次操作吗?我在现有的实施中发现了一个问题,其中一个人无法完成阅读STDERR,我想知道这是一个实施错误还是它不是可能的。

编辑:他们由不同的线程启动。启动和停止可以以任何方式交错。

[1]例如比如Linux 3.0: Executing child process with piped stdin/stdout

1 个答案:

答案 0 :(得分:3)

将文件描述符视为指向内核维护的文件对象的ref-counting / smart间接指针。 dupdup2dup3)通过递增内核维护的文件对象的引用计数来复制智能“指针”。 如果引用计数变为close0将减少引用计数并销毁内核维护的文件对象。

这些文件对象可能由多个进程共享,这通常发生在进程fork(a fork也会增加继承的文件描述符所指向的文件对象的引用计数时(这样做)通过UNIX套接字发送文件描述符))。

(当你处理由pipe复制的fork文件描述符时,记住这个模型尤其重要,因为管道的读取端只会在所有写入结束时获得EOF(在所有具有fd引用该写入结束的进程都已关闭。)