在C / C ++中,您通过dup2(...,STDERR_FILENO)[1]从子进程读取stdout。我真的不明白dup2的作用;我能同时为两个同时运行的子进程执行两次操作吗?我在现有的实施中发现了一个问题,其中一个人无法完成阅读STDERR,我想知道这是一个实施错误还是它不是可能的。
编辑:他们由不同的线程启动。启动和停止可以以任何方式交错。
[1]例如比如Linux 3.0: Executing child process with piped stdin/stdout
答案 0 :(得分:3)
将文件描述符视为指向内核维护的文件对象的ref-counting / smart间接指针。
dup
(dup2
,dup3
)通过递增内核维护的文件对象的引用计数来复制智能“指针”。
如果引用计数变为close
,0
将减少引用计数并销毁内核维护的文件对象。
这些文件对象可能由多个进程共享,这通常发生在进程fork
(a fork
也会增加继承的文件描述符所指向的文件对象的引用计数时(这样做)通过UNIX套接字发送文件描述符))。
(当你处理由pipe
复制的fork
文件描述符时,记住这个模型尤其重要,因为管道的读取端只会在所有写入结束时获得EOF(在所有具有fd引用该写入结束的进程都已关闭。)