当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 8 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : bash 有名管道问题
帖子发表于 : 2012-03-10 21:26 
头像

注册: 2008-07-30 23:21
帖子: 13427
地址: [email protected]
系统: Debian stable AMD64
送出感谢: 38
接收感谢: 127
代码:
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 把上次写的给读走


_________________
(2015-11-16 更新)适合 WM 的截图脚本
(2015-08-24 更新)Debian、Ubuntu 源列表说明
(2013-02-01 首发)文字如何绘出
▷▷ 【更 多 在 此】 ◁◁
箪食瓢饮随遇安,不求栋梁求参天。
【初韵】一门牛逼的编程语言。


最后由 自由建客 编辑于 2012-03-10 21:42,总共编辑了 1 次

页首
 用户资料  
 
2 楼 
 文章标题 : Re: bash 有名管道问题
帖子发表于 : 2012-03-10 21:39 
头像

注册: 2008-07-30 23:21
帖子: 13427
地址: [email protected]
系统: Debian stable AMD64
送出感谢: 38
接收感谢: 127
无语了!/bin/sh(dash) 也是如此。只是 read -u 3 line 要改成 read line <&3 而已。
网上看到的都是说 shell 提供的是阻塞方式!!!!


_________________
(2015-11-16 更新)适合 WM 的截图脚本
(2015-08-24 更新)Debian、Ubuntu 源列表说明
(2013-02-01 首发)文字如何绘出
▷▷ 【更 多 在 此】 ◁◁
箪食瓢饮随遇安,不求栋梁求参天。
【初韵】一门牛逼的编程语言。


页首
 用户资料  
 
3 楼 
 文章标题 : Re: bash 有名管道问题
帖子发表于 : 2012-03-10 22:37 
头像

注册: 2008-07-30 23:21
帖子: 13427
地址: [email protected]
系统: Debian stable AMD64
送出感谢: 38
接收感谢: 127
终于悟到了!不该指望 read 阻塞,而是应该把下面这三个命令看作一个命令,这样才能实现目标!
代码:
exec 3<fifo; read line <&3; exec 3<&-


_________________
(2015-11-16 更新)适合 WM 的截图脚本
(2015-08-24 更新)Debian、Ubuntu 源列表说明
(2013-02-01 首发)文字如何绘出
▷▷ 【更 多 在 此】 ◁◁
箪食瓢饮随遇安,不求栋梁求参天。
【初韵】一门牛逼的编程语言。


页首
 用户资料  
 
4 楼 
 文章标题 : Re: bash 有名管道问题
帖子发表于 : 2012-03-10 23:05 
头像

注册: 2008-07-30 23:21
帖子: 13427
地址: [email protected]
系统: Debian stable AMD64
送出感谢: 38
接收感谢: 127
草!其实写端被打开的话,read 还是会阻塞的!


_________________
(2015-11-16 更新)适合 WM 的截图脚本
(2015-08-24 更新)Debian、Ubuntu 源列表说明
(2013-02-01 首发)文字如何绘出
▷▷ 【更 多 在 此】 ◁◁
箪食瓢饮随遇安,不求栋梁求参天。
【初韵】一门牛逼的编程语言。


页首
 用户资料  
 
5 楼 
 文章标题 : Re: bash 有名管道问题
帖子发表于 : 2012-03-11 20:04 

注册: 2009-07-01 22:04
帖子: 919
送出感谢: 0 次
接收感谢: 13
read line <fifo
#什么原因用&3?


_________________
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。


页首
 用户资料  
 
6 楼 
 文章标题 : Re: bash 有名管道问题
帖子发表于 : 2012-03-11 20:07 
头像

注册: 2008-07-30 23:21
帖子: 13427
地址: [email protected]
系统: Debian stable AMD64
送出感谢: 38
接收感谢: 127
read line <fifo
读的东西在子进程,白读了


_________________
(2015-11-16 更新)适合 WM 的截图脚本
(2015-08-24 更新)Debian、Ubuntu 源列表说明
(2013-02-01 首发)文字如何绘出
▷▷ 【更 多 在 此】 ◁◁
箪食瓢饮随遇安,不求栋梁求参天。
【初韵】一门牛逼的编程语言。


页首
 用户资料  
 
7 楼 
 文章标题 : Re: bash 有名管道问题
帖子发表于 : 2012-03-12 21:05 

注册: 2009-07-01 22:04
帖子: 919
送出感谢: 0 次
接收感谢: 13
[email protected]:~$ mkfifo fifo
[email protected]:~$ read line <fifo
[email protected]:~$ echo $line
hello
[email protected]:~$ read line <fifo
[email protected]:~$ echo $line
world
[email protected]:~$
#
[email protected]:~$ echo hello>fifo
[email protected]:~$ echo world>fifo
[email protected]:~$
#那个子进程?


_________________
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。


页首
 用户资料  
 
8 楼 
 文章标题 : Re: bash 有名管道问题
帖子发表于 : 2012-03-15 13:17 
头像

注册: 2009-04-11 23:46
帖子: 4130
系统: Arch Linux
送出感谢: 11
接收感谢: 124
1. 管道打开时会阻塞的;
2. 管道的 buffer 是一定的;
3. 管道不会记住自己被打开了多少次;
4. 文件读完了,当然返回空;
5. 你看看《UNIX环境高级编程》吧。


_________________
我的博客 https://blog.lilydjwg.me/
提问的智慧
Arch Linux 中文论坛

我的vimrc: https://git.io/vimrc


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 8 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 0 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译