当前位置: 技术问答>linux和unix
请教大家一个关于管道的问题
来源: 互联网 发布时间:2017-02-03
本文导语: 请教大家一个关于管道的问题: 用pipe函数创建一个管道,然后fork一个子进程。 在子进程中,用dup2将stdout替换为管道,然后用execl启动另一个程序。 在父进程中,用read从管道读取,就可以取得那个程序输出的内容。...
请教大家一个关于管道的问题:
用pipe函数创建一个管道,然后fork一个子进程。
在子进程中,用dup2将stdout替换为管道,然后用execl启动另一个程序。
在父进程中,用read从管道读取,就可以取得那个程序输出的内容。
在父进程中,先要用close关闭管道的写入端。这样,当子进程结束时,父进程的read就会失败。
但现在有一个奇怪的现象:父进程只要关闭了写入端,一旦子进程执行execl,则read就会立即失败。
如果父进程不关闭写入端,就可以取得子进程的输出内容,但无法判断子进程是否结束。
请问这是什么原因?
用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.
所以父进程创建子进程之后立即close(pipe[1])即可, 子进程的pipe[1]保持打开, 子进程退出后子进程打开的所有描述符会被关闭, 此时管道的写端pipe[1]没有任何进程打开, 所以read pipe[0]返回EOF.
|
这么奇怪?
这应该与父进程关闭自己的写入端没有关系吧..
这应该与父进程关闭自己的写入端没有关系吧..
|
把程序发上来,要不只能瞎猜了,除非这个错误有人遇到过
|
用个命名管道试试。
|
异步?同步?