如果我们不关闭管道中使用过的一端会发生什么:Linux/C
what happens if we do not close the used end in pipe: Linux/C
假设我们有一个管道,parent 正在上面写入,child 正在从管道读取。
我们知道 parent 应该在写入之前关闭读取端,而 child 应该在读取之前关闭写入端。
但我想知道:
parent写入结束后是否必须关闭写入端?同样,child 需要在阅读完成后关闭阅读端吗?
如果是强制性的,为什么?
这不是强制性的,但您可能想这样做,尤其是在管道的 书写端。
管端文件描述符 被计算为对它们后面的管端实体 的引用。当您 dup
一个 pipe-end filedescriptor 或当您使用一个打开的 pipe-end 分叉进程时,对相同文件的新引用 管端实体 被创建并且引用计数增加(并且每个 close
减少它)。
为了关闭一个写端在另一端变成一个EOF(通常是可取的,否则消费者(reading end) 不知道什么时候停止阅读), writing-end filedescriptor 需要是对 的最后引用writing-end entity——只有当所有对该writing-end entity的引用(文件描述符)都关闭时,管道的写端才被认为是关闭的。
(此行为适用于所有文件描述符,不限于管道结束文件描述符。)
假设我们有一个管道,parent 正在上面写入,child 正在从管道读取。 我们知道 parent 应该在写入之前关闭读取端,而 child 应该在读取之前关闭写入端。 但我想知道: parent写入结束后是否必须关闭写入端?同样,child 需要在阅读完成后关闭阅读端吗? 如果是强制性的,为什么?
这不是强制性的,但您可能想这样做,尤其是在管道的 书写端。
管端文件描述符 被计算为对它们后面的管端实体 的引用。当您 dup
一个 pipe-end filedescriptor 或当您使用一个打开的 pipe-end 分叉进程时,对相同文件的新引用 管端实体 被创建并且引用计数增加(并且每个 close
减少它)。
为了关闭一个写端在另一端变成一个EOF(通常是可取的,否则消费者(reading end) 不知道什么时候停止阅读), writing-end filedescriptor 需要是对 的最后引用writing-end entity——只有当所有对该writing-end entity的引用(文件描述符)都关闭时,管道的写端才被认为是关闭的。
(此行为适用于所有文件描述符,不限于管道结束文件描述符。)