当前位置:  开发笔记 > 编程语言 > 正文

在shell脚本中使用mkfifo

如何解决《在shell脚本中使用mkfifo》经验,为你挑选了1个好方法。

我试图用FIFO做一些简单的事情:读取线条,但不是一次性完成,而且意外地"不起作用".

还行吧:

$ f=$(mktemp -u)
$ mkfifo $f
$ { seq 5 > $f; } &
[1] 2486
$ while read line; do echo $line; done < $f
1
2
3
4
5
[1]+  Done                    { seq 10 > $f; }

但是,如果我尝试逐行读取行,第一次读取成功,第二次读取挂起.

$ { seq 5 > $f; } &
[1] 2527
$ read line < $f; echo $line
1
[1]+  Done                    { seq 5 > $f; }
$ read line < $f; echo $line
[hangs here...]

有人可以解释一下吗?为什么我不能逐一阅读所有5行?其他数据怎么了?


我发现如果我创建一个文件描述符来重定向FIFO,我可以逐行读取:

$ { seq 5 > $f; } &
[1] 2732
$ exec 3<$f
[1]+  Done                    { seq 5 > $f; }
$ read -u 3 line && echo $line || echo no more data
1
$ read -u 3 line && echo $line || echo no more data
2
$ read -u 3 line && echo $line || echo no more data
3
$ read -u 3 line && echo $line || echo no more data
4
$ read -u 3 line && echo $line || echo no more data
5
$ read -u 3 line && echo $line || echo no more data
no more data
$ exec 3<&-

我还是不明白中间情景.谁能解释一下?


版本信息:

$ bash --version
GNU bash, version 4.2.25(1)-release (i686-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$ mkfifo --version
mkfifo (GNU coreutils) 8.13
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later .
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by David MacKenzie.

mustaccio.. 6

我猜这会发生什么:

$ read line < $f打开FIFO进行读取,读取一行,然后关闭FIFO.一旦阅读器关闭了它的侧面,writer(seq 5 > $f)也会关闭.当你下次没有人写入FIFO时打开FIFO,那么read块.

在命令完成while之前,FIFO打开以进行读取while,允许写入器向FIFO发送更多行.

您可以使用它lsof -p $$来验证每个点(不)打开的文件.



1> mustaccio..:

我猜这会发生什么:

$ read line < $f打开FIFO进行读取,读取一行,然后关闭FIFO.一旦阅读器关闭了它的侧面,writer(seq 5 > $f)也会关闭.当你下次没有人写入FIFO时打开FIFO,那么read块.

在命令完成while之前,FIFO打开以进行读取while,允许写入器向FIFO发送更多行.

您可以使用它lsof -p $$来验证每个点(不)打开的文件.

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有