我有两个异步运行的进程,每个进程从一个fifo获取输入,然后将其输出到另一个fifo。我想异步地阅读这些内容。问题是,在fifo关闭之前,我似乎无法获得输出。下面是一个例子
#!/bin/bash -x
rm -rf /tmp/fifo[123].{in,out}
for i in $(seq 1 3) ; do
mkfifo /tmp/fifo$i.in
mkfifo /tmp/fifo$i.out
done
fin1=/tmp/fifo1.in
fout1=/tmp/fifo1.out
fin2=/tmp/fifo2.in
fout2=/tmp/fifo2.out
fin3=/tmp/fifo3.in
fout3=/tmp/fifo3.out
(echo "Proc 1"; while read var; do echo "proc1: " $var; done) < $fin1 > $fout1 &
(echo "Proc 2"; while read var; do echo "proc2: " $var; done) < $fin2 > $fout2 &
(echo "Proc 3"; while read var; do echo "proc3: " $var; done) < $fin3 > $fout3 &
# Get some of the output
cat $fout1 >> /tmp/test.before
cat $fout2 >> /tmp/test.before
cat $fout3 >> /tmp/test.before
# Generate more output
echo "Do you copy proc 1" > $fin1
echo "Do you copy proc 1" > $fin2
echo "Do you copy proc 1" > $fin3
# Get the rest of the output
cat $fout1 >> /tmp/test.after
cat $fout2 >> /tmp/test.after
cat $fout3 >> /tmp/test.after
# Show the results
echo "Before input:"
cat /tmp/test.before
echo "After input:"
cat /tmp/test.after这导致了
$ ./test.sh
+ rm -rf '/tmp/fifo[123].in' '/tmp/fifo[123].out'
++ seq 1 3
+ for i in '$(seq 1 3)'
+ mkfifo /tmp/fifo1.in
+ mkfifo /tmp/fifo1.out
+ for i in '$(seq 1 3)'
+ mkfifo /tmp/fifo2.in
+ mkfifo /tmp/fifo2.out
+ for i in '$(seq 1 3)'
+ mkfifo /tmp/fifo3.in
+ mkfifo /tmp/fifo3.out
+ fin1=/tmp/fifo1.in
+ fout1=/tmp/fifo1.out
+ fin2=/tmp/fifo2.in
+ fout2=/tmp/fifo2.out
+ fin3=/tmp/fifo3.in
+ fout3=/tmp/fifo3.out
+ cat /tmp/fifo1.out我怎么才能得到这样的异步通信呢?我想避免协同进程,因为我事先不知道我需要多少异步进程,这样事情就会变得混乱。
发布于 2014-09-09 00:07:55
添加以下行
for x in $fout1 $fout2 $fout3; do printf "" > $x & done在开始之前,这三个子进程似乎可以打破死锁。我不完全确定为什么。用一些文本替换空字符串将在test.before中生成该文本,因此我怀疑,不仅仅是包含的read,整个子subshell都会阻塞I/O重定向。
发布于 2014-09-09 02:30:31
我想知道为什么要将stdout和stderr重定向放在subshell之外:
(echo "Proc 1"; while read var; do echo "proc1: " $var; done) < $fin1 > $fout1 &
(echo "Proc 2"; while read var; do echo "proc2: " $var; done) < $fin2 > $fout2 &
(echo "Proc 3"; while read var; do echo "proc3: " $var; done) < $fin3 > $fout3 &IMHO应该变成:
(echo "Proc 1" > $fout1; while read var; do echo "proc1: " $var; done < $fin1 >> $fout1) &
(echo "Proc 2" > $fout2; while read var; do echo "proc2: " $var; done < $fin2 >> $fout2) &
(echo "Proc 3" > $fout3; while read var; do echo "proc3: " $var; done < $fin3 >> $fout3) &
look here ^^^^^因此,所有进程,包括重定向,都在从主进程派生的子while中,并且主脚本不会在第一个while循环中阻塞。
https://stackoverflow.com/questions/25726820
复制相似问题