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