You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用C++向CreateProcess创建的子进程发送输入命令

实现方案

核心思路是通过匿名管道重定向子进程的标准输入流,让父进程可以通过管道写入端向子进程发送输入数据,具体实现逻辑如下:

1. 原有代码调整说明

你提供的CreateProcess调用有两处需要修改:

  • 原bInheritHandles参数设为了FALSE,需要改为TRUE,允许子进程继承父进程创建的管道句柄
  • 需要给STARTUPINFO结构新增标准输入句柄配置,将子进程的标准输入绑定到管道的可读端

2. 完整实现代码示例

#include <windows.h>
#include <iostream>
using namespace std;

int main()
{
    SECURITY_ATTRIBUTES sa = {0};
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.bInheritHandle = TRUE; // 开启句柄继承权限
    sa.lpSecurityDescriptor = NULL;

    HANDLE hPipeRead, hPipeWrite;
    // 创建匿名管道
    if (!CreatePipe(&hPipeRead, &hPipeWrite, &sa, 0)) {
        cout << "创建管道失败,错误码:" << GetLastError() << endl;
        return 1;
    }

    STARTUPINFO si = {0};
    si.cb = sizeof(STARTUPINFO);
    si.dwFlags = STARTF_USESTDHANDLES; // 通知子进程使用自定义的标准句柄
    si.hStdInput = hPipeRead; // 子进程标准输入绑定到管道读端
    si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); // 保留原有控制台输出
    si.hStdError = GetStdHandle(STD_ERROR_HANDLE); // 保留原有错误输出

    PROCESS_INFORMATION pi = {0};
    WCHAR myexe[] = L"myexe.exe"; // CreateProcess命令行参数需要使用可写内存,不可直接传const常量

    // 启动子进程
    if (!CreateProcess(
        NULL,
        myexe,
        NULL,
        NULL,
        TRUE, // 开启句柄继承
        0,
        NULL,
        NULL,
        &si,
        &pi
    )) {
        cout << "创建子进程失败,错误码:" << GetLastError() << endl;
        CloseHandle(hPipeRead);
        CloseHandle(hPipeWrite);
        return 1;
    }

    // 父进程不需要管道读端,提前关闭避免资源泄漏
    CloseHandle(hPipeRead);

    // 向子进程发送输入数据,末尾加换行符匹配cin的读取规则(cin遇到空白符即结束单次读取)
    const char* sendMsg1 = "first_input\n";
    DWORD writeLen;
    WriteFile(hPipeWrite, sendMsg1, strlen(sendMsg1), &writeLen, NULL);

    const char* sendMsg2 = "second_input\n";
    WriteFile(hPipeWrite, sendMsg2, strlen(sendMsg2), &writeLen, NULL);

    // 无需继续发送数据时可关闭管道写端
    // CloseHandle(hPipeWrite);

    // 等待子进程退出后清理所有资源
    WaitForSingleObject(pi.hProcess, INFINITE);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    CloseHandle(hPipeWrite);

    return 0;
}

注意事项

  • 如果使用ANSI编码版本的CreateProcess,同样要注意命令行参数需要传入可写的内存区域,不可直接传递字符串常量
  • 如果需要接收子进程的输出返回,可以用同样的管道逻辑重定向子进程的标准输出、标准错误流

内容的提问来源于stack exchange,提问作者akdrkr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 04:15:04