C++ Linux 与另一个程序交互 stdin / stdout

C++ Linux Interact Another Program stdin / stdout

我在 Linux 中有一个可以与 stdin/stdout 交互的可执行文件。我正在尝试用 C++ 编写一个程序,它可以交互式地调用这个程序,向它的标准输入发送命令,并捕获它的标准输出。

我一直很困惑。我不想分叉我的程序(是吗?)。我确实希望我的程序能够启动 "client"、发送数据、获取输出、发送更多数据、获取更多输出……并关闭 "client".

P.S。是的,我确定之前有人问过这个问题,但我花了几个小时真的挠头 - 可能没有使用正确的关键字。

执行另一个程序的唯一方法是通过 exec() 系统调用之一。这是唯一的方法。而且,如您所知,exec() 将正在执行的程序替换为 exec() 指定的程序。发出 exec() 的进程将不再存在,它的 PID 现在被新程序使用。

因此从逻辑上讲,除非您希望您的程序被其他可执行文件替换,否则您的程序必须 fork(),并且子进程使用 exec() 来执行新的可执行文件。这是启动新流程并继续 运行 原始流程的传统方式。 fork() 是必需的。

你描述的情况是相当典型的,按数字绘制的情况,已经做过无数次了:

  1. 使用 pipe() 创建两个管道,一个用于管道标准输入,一个用于管道标准输出。

  2. 使用 fork()。子进程 dup2() 将 stdin 管道的读取端设置为 0,将 stdout 管道的写入端设置为 1,关闭每个原始管道的两端,并 exec() 设置新进程。

  3. 父进程关闭stdin管道的读端、stdout管道的写端,然后继续使用stdin管道的写端和读端与子进程进行交互标准输出管道。