sh/bash/dash/ksh/zsh等Shell脚本
-
自由建客
- 帖子: 13468
- 注册时间: 2008-07-30 23:21
- 系统: Debian stable AMD64
#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
#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
#3
帖子
由 自由建客 » 2012-03-10 22:37
终于悟到了!不该指望 read 阻塞,而是应该把下面这三个命令看作一个命令,这样才能实现目标!
代码: 全选
exec 3<fifo; read line <&3; exec 3<&-
-
自由建客
- 帖子: 13468
- 注册时间: 2008-07-30 23:21
- 系统: Debian stable AMD64
#4
帖子
由 自由建客 » 2012-03-10 23:05
草!其实写端被打开的话,read 还是会阻塞的!
-
fnan
- 帖子: 919
- 注册时间: 2009-07-01 22:04
#5
帖子
由 fnan » 2012-03-11 20:04
read line <fifo
#什么原因用&3?
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
-
自由建客
- 帖子: 13468
- 注册时间: 2008-07-30 23:21
- 系统: Debian stable AMD64
#6
帖子
由 自由建客 » 2012-03-11 20:07
read line <fifo
读的东西在子进程,白读了
-
fnan
- 帖子: 919
- 注册时间: 2009-07-01 22:04
#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
-
联系:
#8
帖子
由 lilydjwg » 2012-03-15 13:17
1. 管道打开时会阻塞的;
2. 管道的 buffer 是一定的;
3. 管道不会记住自己被打开了多少次;
4. 文件读完了,当然返回空;
5. 你看看《UNIX环境高级编程》吧。