首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash将stdio重定向到命名管道

Bash将stdio重定向到命名管道
EN

Stack Overflow用户
提问于 2014-09-08 22:38:51
回答 2查看 387关注 0票数 1

我有两个异步运行的进程,每个进程从一个fifo获取输入,然后将其输出到另一个fifo。我想异步地阅读这些内容。问题是,在fifo关闭之前,我似乎无法获得输出。下面是一个例子

代码语言:javascript
复制
#!/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

这导致了

代码语言:javascript
复制
$ ./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

我怎么才能得到这样的异步通信呢?我想避免协同进程,因为我事先不知道我需要多少异步进程,这样事情就会变得混乱。

EN

回答 2

Stack Overflow用户

发布于 2014-09-09 00:07:55

添加以下行

代码语言:javascript
复制
for x in $fout1 $fout2 $fout3; do printf "" > $x & done

在开始之前,这三个子进程似乎可以打破死锁。我不完全确定为什么。用一些文本替换空字符串将在test.before中生成该文本,因此我怀疑,不仅仅是包含的read,整个子subshell都会阻塞I/O重定向。

票数 1
EN

Stack Overflow用户

发布于 2014-09-09 02:30:31

我想知道为什么要将stdout和stderr重定向放在subshell之外:

代码语言:javascript
复制
(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应该变成:

代码语言:javascript
复制
(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循环中阻塞。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25726820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档