【发布时间】:2015-11-10 09:01:13
【问题描述】:
假设我们有一个管道,父级在上面写,子级正在从管道中读取。 我们知道父母应该在写作之前关闭阅读端,孩子应该在阅读之前关闭写作端。 但我想知道: 家长写完后是否必须关闭写端?同样,孩子阅读完后需要关闭阅读端吗? 如果是强制性的,为什么会这样?
【问题讨论】:
假设我们有一个管道,父级在上面写,子级正在从管道中读取。 我们知道父母应该在写作之前关闭阅读端,孩子应该在阅读之前关闭写作端。 但我想知道: 家长写完后是否必须关闭写端?同样,孩子阅读完后需要关闭阅读端吗? 如果是强制性的,为什么会这样?
【问题讨论】:
这不是强制性的,但您可能想要这样做,尤其是在管道的写入端。
管道端文件描述符是对它们后面的管道端实体的计数引用。当你dup一个pipe-end filedescriptor或者当你fork一个带有开放pipe-end的进程时,新的引用到同一个pipe-end实体 被创建并且引用计数增加(每个close 减少它)。
为了关闭一个写作端变成一个EOF在另一端(通常是可取的,否则消费者(阅读端 ) 不知道何时停止读取),writing-end filedescriptor 需要是对 writing-end entity 的最后引用——仅考虑管道的写入端如果对该写入端实体的所有引用(文件描述符)都已关闭,则关闭。
(此行为适用于所有文件描述符,不限于管道端文件描述符。)
【讨论】: