我在Linux中有一个可以与stdin / stdout交互的可执行文件。我试图用C ++编写一个程序,它可以交互地调用这个程序,将命令发送到它的stdin,并捕获它的标准输出。
我一直很困惑。我不想分叉我的程序(是吗?)。我希望我的程序能够启动"客户端",发送数据,获取输出,发送更多数据,获得更多输出,......,并关闭"客户端"。
P.S。是的,我确定以前曾经问过这个问题,但是我花了几个小时真的摸不着头脑 - 可能没有使用正确的关键字。
答案 0 :(得分:3)
执行另一个程序的唯一方法是通过exec()
系统调用之一。这是唯一的方法。而且,如您所知,exec()
将执行程序替换为exec()
指定的程序。发布exec()
的流程将不再存在,新程序现在使用PID
。
因此从逻辑上讲,除非您希望将程序替换为其他可执行文件,否则您的程序必须fork()
,并且子进程使用exec()
来执行新的可执行文件。这是启动新进程并继续运行原始进程的传统方法。为此需要fork()
。
你所描述的情况是相当典型的,按数字描绘的情况,已经无数次地完成了:
使用pipe()创建两个管道,一个用于管道stdin,一个用于管道stdout。
使用fork()。子进程dup2()
将stdin管道的读取结束为0,将stdout管道的写入结束为1,关闭每个原始管道的两端,并exec()
为新进程。
父进程关闭stdin管道的读取端,即stdout管道的写入端,然后使用stdin管道的写入端和stdout管道的读取端继续与子进程交互