У меня есть скрипт bash, который хочет выполнять некоторую работу параллельно, я делал это, помещая каждое задание в подоболочку, которая запускается в фоновом режиме. Хотя число одновременно выполняемых заданий должно быть ограничено, я достигаю это, сначала помещая несколько строк в FIFO, а затем непосредственно перед разветвлением подоболочки, родительский скрипт должен прочитать строку из этого FIFO. Только после того, как он получит строку, он может раскошелиться на подоболочку. До сих пор все отлично работает. Но когда я попытался прочитать строку из FIFO в подоболочке, оказалось, что только одна подоболочка может получить строку, даже если в FIFO явно больше строк. Поэтому мне интересно, почему другие подоболочки не могут читать строки, даже если в FIFO больше строк.
Мой тестовый код выглядит примерно так:
#!/bin/sh
fifo_path="/tmp/fy_u_test2.fifo"
mkfifo $fifo_path
#open fifo for r/w at fd 6
exec 6<> $fifo_path
process_num=5
#put $process_num lines in the FIFO
for ((i=0; i<${process_num}; i++)); do
echo "$i"
done >&6
delay_some(){
local index="$1"
echo "This is what u can see. $index \n"
sleep 20;
}
#In each iteration, try to read 2 lines from FIFO, one from this shell,
#the other from the subshell
for i in 1 2
do
date >>/tmp/fy_date
#If a line can be read from FIFO, run a subshell in bk, otherwise, block.
read -u6
echo " $$ Read --- $REPLY --- from 6 \n" >> /tmp/fy_date
{
delay_some $i
#Try to read a line from FIFO, __ only one subshell succeeds the following line. __
read -u6
echo " $$ This is in child # $i, read --- $REPLY --- from 6 \n" >> /tmp/fy_date
} &
done
И выходной файл / tmp / fy_date содержит:
Mon Apr 26 16:02:18 CST 2010
32561 Read --- 0 --- from 6 \n
Mon Apr 26 16:02:18 CST 2010
32561 Read --- 1 --- from 6 \n
32561 This is in child # 1, read --- 2 --- from 6 \n
Там я ожидаю такую строку:
32561 This is in child # 2, read --- 3 --- from 6 \n
Но он никогда не появляется, и дочерний процесс № 2 блокируется там, пока я не выдам:
что-то повторить> /tmp/fy_u_test2.fifo