如何让两个进程(程序)通过管道直接通信?
程序A是一个C语言写的程序,它会不停地从标准输入(stdin)接收数据,处理这些数据,然后把结果输出到标准输出(stdout)。
我想写一个程序B(用Python),让它能够读取程序A的输出,并根据需要把数据反馈回去。需要注意的是,这两个程序每种只能有一个实例,也就是说,如果有b1和b2这两个程序实例,它们都是程序B的不同运行,而不是:
$ b1 | a | b2
我需要有
$ b1 | a | b1
下面是我想要的最终结果的示意图:
2 个回答
1
对于那些通过谷歌来到这里的人:其实有一种很好的方法可以使用命名管道:
首先创建两个命名管道:
mkfifo pipe1
mkfifo pipe2
然后运行这个:
echo -n x | cat - pipe1 > pipe2 & cat <pipe2 > pipe1
这样会让cat命令不断地把字母x互相复制。所以现在你可以随意使用自己的程序来处理输入和输出,而不局限于cat。这不仅限于python,你也可以把一个java程序和一个c++程序连接起来。
例如,如果你的程序叫做A.py和B.py,最开始的命令会是:
echo -n x | ./A.py - pipe1 > pipe2 & ./B.py <pipe2 > pipe1
7
使用 subprocess.Popen
这个类可以为程序 A 创建一个子进程。比如说:
import subprocess
import sys
# Create subprocess with pipes for stdin and stdout
progA = subprocess.Popen("a", stdin=subprocess.PIPE, stdout=subprocess.PIPE)
# Reassign the pipes to our stdin and stdout
sys.stdin = progA.stdout
sys.stdout = progA.stdin
现在这两个进程可以通过管道互相交流。为了安全起见,最好把原来的 sys.stdin
和 sys.stdout
保存到其他变量里,这样如果你决定结束这个子进程,就可以把输入和输出恢复到最初的状态(比如说恢复到终端)。