我写了这样一个脚本:
当我运行这个脚本时,它会停在
我写了这样一个脚本:
N=5
FIFO=/tmp/$$.fifo
mkfifo $FIFO
loop(){
for i in $(seq 1 $N); do
read tmp < $FIFO
echo "$i out"
done
}
loop &
LOOP_PID=$!
for i in $(seq 1 $N); do
echo $i > $FIFO
echo "$i in"
done
wait $LOOP_PID
当我运行这个脚本时,它会停在
wait $LOOP_PID
处,无法继续执行。因此,我使用文件描述符修改了这个脚本:N=5
FIFO=/tmp/$$.fifo
mkfifo $FIFO
exec 3<>$FIFO
loop(){
for i in $(seq 1 $N); do
read -u3 tmp
echo "$i out"
done
}
loop &
LOOP_PID=$!
for i in $(seq 1 $N); do
echo $i >&3
echo "$i in"
done
wait $LOOP_PID
这还好。
当我直接使用FIFOs时,它无法连续读取FIFOs中的数据,并且会挂起。但是当我使用文件描述符时,一切都正常。这是什么原因呢?
sleep 1; echo $i > $FIFO
时,它就不起作用了。 - solomon_wzsuntil read tmp
,让它循环直到读取到非空行,这样做是可以的。但我仍然有一个问题,为什么文件描述符可以很好地完成这项工作? - solomon_wzs