我在 Linux 中有一个可以与 stdin/stdout 交互的可执行文件。我正在尝试用 C++ 编写一个程序,它可以交互地调用该程序,向其标准输入发送命令,并捕获其标准输出。
我真的很困惑。我不想分叉我的程序(是吗?)。我确实希望我的程序能够启动“客户端”,发送数据,获取输出,发送更多数据,获取更多输出,...,然后关闭“客户端”。
附:是的,我确信以前有人问过这个问题,但我花了几个小时真正摸不着头脑——可能没有使用正确的关键字。
执行另一个程序的唯一方法是通过其中一个exec()
系统调用。这是唯一的办法。而且,如你所知,exec()
用指定的程序替换正在执行的程序exec()
。发出的流程exec()
将不再存在,它是PID
现在被新程序使用。
因此,从逻辑上讲,除非您希望您的程序被其他可执行文件替换,否则您的程序必须fork()
,子进程使用exec()
执行新的可执行文件。这是启动新进程并继续运行原始进程的传统方式。 Afork()
为此需要。
您描述的情况是相当典型的、按数字绘制的情况,这种情况已经发生过无数次了:
使用 pipeline() 创建两个管道,一个用于管道标准输入,一个用于管道标准输出。
使用 fork()。子进程dup2()
将 stdin 管道的读取端设置为 0,将 stdout 管道的写入端设置为 1,关闭每个原始管道的两端,并且exec()
是新流程。
父进程关闭stdin管道的读取端、stdout管道的写入端,然后使用stdin管道的写入端和stdout管道的读取端继续与子进程交互。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)