我不知道为什么父进程在调用wait()
之前需要关闭管道的文件描述符?
我有一个C程序:
ls -l
,并写入管道(关闭管道读取结束后)。wait()
等待两个孩子完成。我注意到,如果父级在调用wait()
系统调用之前没有关闭管道的两个文件描述符,那么程序将被阻止。在阅读了已在网上发布的几个问题之后,看起来这是一般规则并且需要完成。但我找不到为什么要这样做的原因?
如果父级没有关闭管道的文件描述符,为什么wait()
不返回?
我想,在最坏的情况下,如果父节点没有关闭管道的文件描述符,那么唯一的后果就是管道将保持存在(这是浪费资源)。但是我从没想过这会阻止子进程的执行(因为可以看出因为wait()
没有返回)。
还记得,父母根本没有使用管道。在管道中写入child_a
,从管道读取child_b
。
答案 0 :(得分:3)
如果父进程没有关闭管道的写入端,则子进程永远不会获得EOF(读取零字节),因为有一个进程可能(但不会被写入)写入管道。由于同样的原因,子进程也必须关闭管道的写入端 - 如果它没有,那么可能(但不会)写入管道的进程(本身),所以读取不会返回EOF。
如果将管道的一端复制到标准输出或标准错误,则应关闭该管道的两端。在使用管道的多进程代码中没有足够的close()
调用是一个常见的错误。偶尔,你会变得邋,,但细节因案例而异,通常你不会。