为什么父进程在调用wait()之前必须关闭管道的所有文件描述符?

时间:2015-06-29 03:02:22

标签: c process pipe parent-child

我不知道为什么父进程在调用wait()之前需要关闭管道的文件描述符?

我有一个C程序:

  1. 父创建child_a,使用execvp执行ls -l,并写入管道(关闭管道读取结束后)。
  2. Parent创建另一个子节点(不关闭管道的任何文件描述符),称为child_b,它通过读取管道来执行'wc'。(在关闭管道末尾之后)。
  3. 父母两次致电wait()等待两个孩子完成。
  4. 我注意到,如果父级在调用wait()系统调用之前没有关闭管道的两个文件描述符,那么程序将被阻止。在阅读了已在网上发布的几个问题之后,看起来这是一般规则并且需要完成。但我找不到为什么要这样做的原因?

    如果父级没有关闭管道的文件描述符,为什么wait()不返回?

    我想,在最坏的情况下,如果父节点没有关闭管道的文件描述符,那么唯一的后果就是管道将保持存在(这是浪费资源)。但是我从没想过这会阻止子进程的执行(因为可以看出因为wait()没有返回)。

    还记得,父母根本没有使用管道。在管道中写入child_a,从管道读取child_b

1 个答案:

答案 0 :(得分:3)

如果父进程没有关闭管道的写入端,则子进程永远不会获得EOF(读取零字节),因为有一个进程可能(但不会被写入)写入管道。由于同样的原因,子进程也必须关闭管道的写入端 - 如果它没有,那么可能(但不会)写入管道的进程(本身),所以读取不会返回EOF。

如果将管道的一端复制到标准输出或标准错误,则应关闭该管道的两端。在使用管道的多进程代码中没有足够的close()调用是一个常见的错误。偶尔,你会变得邋,,但细节因案例而异,通常你不会。