分页: 1 / 1
bash 有名管道问题
发表于 : 2012-03-10 21:26
由 自由建客
代码: 全选
bash1 ~$ mkfifo fifo
bash1 ~$ exec 3<fifo # 结果在这阻塞
# 打开另一终端 bash2
bash2 ~$ echo hello >fifo # 本 shell 并未阻塞,同时 bash1 解放,回到提示符
bash2 ~$ echo world >fifo # 本 shell 还是未阻塞
# 回到 bash1
bash1 ~$ read -u 3 line; echo $line # 输出 hello
bash1 ~$ read -u 3 line; echo $line # 输出 world
bash1 ~$ read -u 3 line; echo $line # 未阻塞,输出空
bash1 ~$ read -u 3 line; echo $line # 未阻塞,输出空
bash1 ~$ read -u 3 line; echo $line # 未阻塞,输出空
# 再到 bash2
bash2 ~$ echo abcdefg >fifo # 未阻塞
bash2 ~$ echo hijklmn >fifo # 未阻塞
bash2 ~$ echo opqrst >fifo # 未阻塞
bash2 ~$ echo uvwxyz >fifo # 未阻塞
我真正希望的是:
bash1 在 exec 3<fifo 时不阻塞,因为还没读数据嘛,只是打开而已。
bash1 在读空管道时,阻塞
bash2 对空管道写入,不阻塞,一旦写入一次,管道非空,第二次写时就阻塞,直到 bash1 把上次写的给读走
Re: bash 有名管道问题
发表于 : 2012-03-10 21:39
由 自由建客
无语了!/bin/sh(dash) 也是如此。只是 read -u 3 line 要改成 read line <&3 而已。
网上看到的都是说 shell 提供的是阻塞方式!!!!
Re: bash 有名管道问题
发表于 : 2012-03-10 22:37
由 自由建客
终于悟到了!不该指望 read 阻塞,而是应该把下面这三个命令看作一个命令,这样才能实现目标!
代码: 全选
exec 3<fifo; read line <&3; exec 3<&-
Re: bash 有名管道问题
发表于 : 2012-03-10 23:05
由 自由建客
草!其实写端被打开的话,read 还是会阻塞的!
Re: bash 有名管道问题
发表于 : 2012-03-11 20:04
由 fnan
read line <fifo
#什么原因用&3?
Re: bash 有名管道问题
发表于 : 2012-03-11 20:07
由 自由建客
read line <fifo
读的东西在子进程,白读了
Re: bash 有名管道问题
发表于 : 2012-03-12 21:05
由 fnan
kose3@kose3-desktop:~$ mkfifo fifo
kose3@kose3-desktop:~$ read line <fifo
kose3@kose3-desktop:~$ echo $line
hello
kose3@kose3-desktop:~$ read line <fifo
kose3@kose3-desktop:~$ echo $line
world
kose3@kose3-desktop:~$
#
kose3@kose3-desktop:~$ echo hello>fifo
kose3@kose3-desktop:~$ echo world>fifo
kose3@kose3-desktop:~$
#那个子进程?
Re: bash 有名管道问题
发表于 : 2012-03-15 13:17
由 lilydjwg
1. 管道打开时会阻塞的;
2. 管道的 buffer 是一定的;
3. 管道不会记住自己被打开了多少次;
4. 文件读完了,当然返回空;
5. 你看看《UNIX环境高级编程》吧。