linux shell 命名管道被阻塞

son函数后台从临时管道中读取。从主shell中把father2输出写入管道。可以运行father1从子程序中写入管道。被阻塞,为什么?有办法解决么?#!/bin/bas... son函数后台从临时管道中读取。
从主shell中把father2输出写入管道。可以运行
father1从子程序中写入管道。被阻塞,为什么?有办法解决么?
#!/bin/bash
pipe=$(mktemp tmp.XXX)
rm -f $pipe
mkfifo $pipe
#从管道文件中读取
function son (){
while read LINE
do
echo from pipe:$LINE
done<$pipe
}
echo current $$
echo start son
son &
echo $!
Pson=$!
function father1(){
while read subLINE
do
echo father1:read $subLINE
if [ "$subLINE" = "exit" ]; then
break
fi
echo father1:write to pipe:
echo "$subLINE" >> "$pipe"
echo father1:write yes
done
}
function father2(){
while read subLINE
do
if [ "$subLINE" = "exit" ]; then
break
fi
echo $subLINE
done
}
echo input \'exit\' to exitout
echo start father2
father2 >>$pipe
echo start father1
echo 为什么father1内的管道写入操作会被阻塞
father1
rm -f $pipe
别看代码老长,其实没啥东西。就3重定向。其他的都是read 后 echo
展开
 我来答
kwydwuf
2012-09-04 · TA获得超过7411个赞
知道大有可为答主
回答量:1527
采纳率:71%
帮助的人:2021万
展开全部
并不像你想像的那样(son一直读取fifo), son 只会读取一次 fifo 文件就结束了。由于father1第二次写的时候没有读取者,所以你的写fifo的函数就会被block。 把son 改成

function son (){
while true
do
read line <$pipe
echo from pipe:$LINE
done
}
即可,当然,你可以考虑在 son 中加上判断结束的条件,比如从fifo中读到特定字符串就退出循环等。这里不再赘述。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式