LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 998|回复: 5

求:读有名管道的好方法

[复制链接]
发表于 2007-12-1 12:24:28 | 显示全部楼层 |阅读模式
遇到的问题是:
我只是用一个有名管道文件,为加快速度,管道文具挂在内存,是为不同的程序如sed  grep awk 等传递数据之用。
读管道的函数不判断管道的内容是否合适,每一次写入都对应一个读的动作,但读函数不一定将管道的内容读完,所以在将内容送入有名管道之前,因不知道管道文件是否为空,要求清空管道。
我使用的方法只是简单地读管道: pipe 是一个有名管道
while [ -s pipe ]  &&  read
do
:
done <pipe
但程序好像进入长时间等待的状态。我试过,在命令行下cat一个空的管道,会产生这种现状。
发表于 2007-12-1 14:05:55 | 显示全部楼层
管道的另一端没人写东西的话这边当然就被阻塞了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-1 23:53:30 | 显示全部楼层
Post by remote fish;1790121
管道的另一端没人写东西的话这边当然就被阻塞了



疑惑的是:为什么wh ile [ -s pipe ] 语句不起作用。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-2 13:09:03 | 显示全部楼层
可能while  [ -s tmp/pipe ]  对管道文件不正常,退而求之,才用了如下方法:
echo "wwW" >tmp/pipe & #先写入 一些内容,保证读不会堵塞,然后读空管道文件。
while read
do
:
done<tmp/pipe
回复 支持 反对

使用道具 举报

发表于 2007-12-2 16:51:39 | 显示全部楼层
不是[ -s tmp/pipe ]对管道文件不正常,而是根本就不会执行到这里,shell执行的时候会先处理重定向,当它试图打开tmp/pipe时就被阻塞了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-2 17:40:03 | 显示全部楼层
Post by ocean390;1790513
不是[ -s tmp/pipe ]对管道文件不正常,而是根本就不会执行到这里,shell执行的时候会先处理重定向,当它试图打开tmp/pipe时就被阻塞了。

谢谢!功力很深!

改写了代码:
if [ -s tmp/pipe ]
then
while read
do
:
done <tmp/pipe
fi



我原来的代码是
if [ -s tmp/pipe ]
then
cat tmp/pipe
fi

后来,觉得cat来处理效率低,就改用while read 的结构,没想到有重定向的问题,也弄不明白是什么问题。再次谢谢楼上!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表