c++ - 使用管道或套接字创建子进程到标准输入/标准输出
问题描述
我有一个交互式 Windows 控制台程序,它接受来自标准输入的输入并将输出写入标准输出。出于这个问题的目的,我们可以将其视为执行一个无限循环,它只是回显stdin
到stdout
:
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++ 示例。我尝试过使用各种创建管道的选项,也尝试过使用套接字,但我就是无法让它工作。我开始觉得自己很愚蠢。有人可以帮我吗?
解决方案
推荐阅读
- php - 对象包含太多列
- javascript - 如何制作将文本添加到 div 的可点击按钮
- vespa - 按“vespa.ai”中的日期属性对结果集进行排序
- c++ - 如何实现 WTSRegisterSessionNotification 功能
- jquery - 有没有办法在浏览器中使用 require 函数而不使用 Browserify、RequireJs 或类似的包
- python - 是否可以检查列表中的项目是否存在于变量中?
- android - AsyncTask 未在 oncreate 中执行
- visual-studio - TFS 脱机,联机显示许多文件的方式已更改
- scala - Spark-Scala 代码在 Spark-Shell 中运行完成,但通过 Spark-Submit 无限运行
- regex - 同一个 perl 命名正则表达式提取的多个名称