C ++ Linux Interact另一个程序stdin / stdout

时间:2016-09-26 02:33:54

标签: c++ linux shell interactive

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

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

P.S。是的,我确定以前曾经问过这个问题,但是我花了几个小时真的摸不着头脑 - 可能没有使用正确的关键字。

1 个答案:

答案 0 :(得分:3)

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

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

你所描述的情况是相当典型的,按数字描绘的情况,已经无数次地完成了:

  1. 使用pipe()创建两个管道,一个用于管道stdin,一个用于管道stdout。

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

  3. 父进程关闭stdin管道的读取端,即stdout管道的写入端,然后使用stdin管道的写入端和stdout管道的读取端继续与子进程交互