如何让两个进程(程序)通过管道直接通信?

4 投票
2 回答
3483 浏览
提问于 2025-04-16 08:16

程序A是一个C语言写的程序,它会不停地从标准输入(stdin)接收数据,处理这些数据,然后把结果输出到标准输出(stdout)。

我想写一个程序B(用Python),让它能够读取程序A的输出,并根据需要把数据反馈回去。需要注意的是,这两个程序每种只能有一个实例,也就是说,如果有b1和b2这两个程序实例,它们都是程序B的不同运行,而不是:

$ b1 | a | b2

我需要有

$ b1 | a | b1 

下面是我想要的最终结果的示意图:

alt text

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.stdinsys.stdout 保存到其他变量里,这样如果你决定结束这个子进程,就可以把输入和输出恢复到最初的状态(比如说恢复到终端)。

撰写回答