分页: 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环境高级编程》吧。