我有以下情况:
创建一个管道。
分叉一个子进程。
子进程明确关闭管道的读端并向管道的写端写入数据,并在不关闭任何内容的情况下退出(我认为,exit应该代表子进程关闭所有打开的文件/管道描述符)。
父进程明确关闭管道的写端,并使用
fgets
从管道的读端读取,直到fgets
返回NULL。即完全读取。
现在我的问题是,一旦完成读取,为什么父进程需要显式关闭管道的读端呢?系统是否应该明智地在完全从读端读取数据后删除管道?
如果我没有在父进程中明确关闭读端,则迟早会出现Too many file descriptors
错误,而在打开更多的管道时。我的假设是,系统会自动删除管道,一旦它的写端被关闭并且从读端完全读取了数据。因为你无法再次从管道中读取!
那么,为什么系统在完全读取数据并关闭写端后不删除管道的原理是什么?