bash 有名管道问题

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

bash 有名管道问题

#1

帖子 自由建客 » 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 把上次写的给读走
上次由 自由建客 在 2012-03-10 21:42,总共编辑 1 次。
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: bash 有名管道问题

#2

帖子 自由建客 » 2012-03-10 21:39

无语了!/bin/sh(dash) 也是如此。只是 read -u 3 line 要改成 read line <&3 而已。
网上看到的都是说 shell 提供的是阻塞方式!!!!
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: bash 有名管道问题

#3

帖子 自由建客 » 2012-03-10 22:37

终于悟到了!不该指望 read 阻塞,而是应该把下面这三个命令看作一个命令,这样才能实现目标!

代码: 全选

exec 3<fifo; read line <&3; exec 3<&-
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: bash 有名管道问题

#4

帖子 自由建客 » 2012-03-10 23:05

草!其实写端被打开的话,read 还是会阻塞的!
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: bash 有名管道问题

#5

帖子 fnan » 2012-03-11 20:04

read line <fifo
#什么原因用&3?
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: bash 有名管道问题

#6

帖子 自由建客 » 2012-03-11 20:07

read line <fifo
读的东西在子进程,白读了
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: bash 有名管道问题

#7

帖子 fnan » 2012-03-12 21:05

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:~$
#那个子进程?
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: bash 有名管道问题

#8

帖子 lilydjwg » 2012-03-15 13:17

1. 管道打开时会阻塞的;
2. 管道的 buffer 是一定的;
3. 管道不会记住自己被打开了多少次;
4. 文件读完了,当然返回空;
5. 你看看《UNIX环境高级编程》吧。
回复