加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 在shell脚本中使用mkfifo

发布时间:2020-12-15 21:59:38 所属栏目:安全 来源:网络整理
导读:我试图用FIFO做一些简单的事情:读取线条,但不是一次性完成,而且意外地“不起作用”. 还行吧: $f=$(mktemp -u)$mkfifo $f${ seq 5 $f; } [1] 2486$while read line; do echo $line; done $f12345[1]+ Done { seq 10 $f; } 但是,如果我尝试逐行读取行,第一次
我试图用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 <http://gnu.org/licenses/gpl.html>

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 <http://gnu.org/licenses/gpl.html>.
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.

解决方法

我猜这会发生什么:

$read line< $f打开FIFO进行读取,读取一行,然后关闭FIFO.一旦读取器关闭其侧面的FIFO,则写入器(seq 5> $f)也关闭.当你下次没有人写入FIFO时打开FIFO,所以读取阻塞. 随着FIFO打开读取直到while命令完成,允许写入器向FIFO发送更多行. 您可以使用lsof -p $$来验证每个点(不)打开的文件.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读