首页 > 解决方案 > 使用管道或套接字创建子进程到标准输入/标准输出

问题描述

我有一个交互式 Windows 控制台程序,它接受来自标准输入的输入并将输出写入标准输出。出于这个问题的目的,我们可以将其视为执行一个无限循环,它只是回显stdinstdout

for ( ; ; ) {
  fgets (buff, BUFSIZE, stdin) ;
  printf ("%s", s) ;
}

我正在用 C++ 编写另一个程序,将该程序作为子进程运行,我想向子进程发送命令并读取响应。换句话说,我想创建让我写入子进程stdin并从子进程读取的管道或套接字stdout

我从 Microsoft 文章Creating a Child Process with Redirected Input and Output开始。但这仅适用于单个写/读周期。写入子进程后stdin,它会关闭管道句柄:

// Close the pipe handle so the child process stops reading.
if ( ! CloseHandle(g_hChildStd_IN_Wr) )
  ErrorExit(TEXT("StdInWr CloseHandle"));

如果我不在这里关闭管道句柄,子进程永远不会从它的fgets. 但是,如果我确实关闭了子句柄,则管道对我来说丢失了。

在我看来,这一定是一个非常常见的用例,但是我在 Internet 上找不到一个可以满足我要求的 C++ 示例。我尝试过使用各种创建管道的选项,也尝试过使用套接字,但我就是无法让它工作。我开始觉得自己很愚蠢。有人可以帮我吗?

标签: c++windowssocketspipecreateprocess

解决方案


推荐阅读