日期:2014-05-16  浏览次数:20715 次

请教大家一个关于管道的问题
请教大家一个关于管道的问题:
用pipe函数创建一个管道,然后fork一个子进程。
在子进程中,用dup2将stdout替换为管道,然后用execl启动另一个程序。
在父进程中,用read从管道读取,就可以取得那个程序输出的内容。
在父进程中,先要用close关闭管道的写入端。这样,当子进程结束时,父进程的read就会失败。
但现在有一个奇怪的现象:父进程只要关闭了写入端,一旦子进程执行execl,则read就会立即失败。
如果父进程不关闭写入端,就可以取得子进程的输出内容,但无法判断子进程是否结束。
请问这是什么原因?


------解决方案--------------------
这么奇怪?
这应该与父进程关闭自己的写入端没有关系吧..
------解决方案--------------------
把程序发上来,要不只能瞎猜了,除非这个错误有人遇到过
------解决方案--------------------
用个命名管道试试。
------解决方案--------------------
异步?同步?
------解决方案--------------------
因为父子进程都持有管道的pipe[1], 只有父子进程的pipe[1]都关闭才能read pipe[0]返回EOF(0).

所以父进程创建子进程之后立即close(pipe[1])即可, 子进程的pipe[1]保持打开, 子进程退出后子进程打开的所有描述符会被关闭, 此时管道的写端pipe[1]没有任何进程打开, 所以read pipe[0]返回EOF.