通过将标准输入/输出重定向到管道来创建子进程

问题描述 投票:1回答:1

我正在尝试使用重定向的stdin / stdout创建一个子进程。我正在创建一个管道来重定向标准输入并将标准输出写入文件。

这是我尝试过的

#include <Windows.h>
#include <iostream>

int main()
{
    STARTUPINFOA sInfo;
    PROCESS_INFORMATION pInfo;
    SECURITY_ATTRIBUTES sAttr;
    ZeroMemory(&sInfo, sizeof(sInfo));
    ZeroMemory(&pInfo, sizeof(pInfo));
    ZeroMemory(&sAttr, sizeof(sAttr));
    sInfo.cb = sizeof(sInfo);
    sAttr.bInheritHandle = true;
    HANDLE fileTest = CreateFileA("hello.txt", GENERIC_READ | GENERIC_WRITE, 0, &sAttr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    HANDLE stdinPipe = CreateNamedPipeA("\\\\.\\pipe\\DokiDokiIn", PIPE_ACCESS_INBOUND, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, 1, 1024, 1024, NMPWAIT_USE_DEFAULT_WAIT, &sAttr);
    sInfo.hStdInput = stdinPipe;
    sInfo.hStdOutput = fileTest;
    sInfo.hStdError = fileTest;
    sInfo.dwFlags |= STARTF_USESTDHANDLES;
    char cmdLine[] = "cmd.exe";
    bool success = CreateProcessA("C:\\WINDOWS\\system32\\cmd.exe", NULL, &sAttr, NULL, NULL, NULL, NULL, NULL, &sInfo, &pInfo);
    if (!success) {
        std::cout << "CreateProcessA() failed with error " << GetLastError() << "\n";
    }
    std::cout << GetLastError() << "\n";
    return 0;
}

这似乎不起作用,每当我将STARTF_USESTDHANDLES指定为dwFlags时,打开的进程都会立即关闭(或不确定,根本无法打开)。当我不指定标志但未重定向I / O时,它可以工作。而且,正如预期的那样,使用我的管道客户端无法对其进行写入,因此无法获得该管道的句柄。CreateFile始终为true,并且句柄值似乎有效,GetLastError()返回0,但程序仅退出且子进程没有弹出窗口,即使它在后台运行也无法写入。

c++ winapi pipe stdio
1个回答
0
投票

根据您所代表的代码,发现两个问题:

    bInheritHandles的CreateProcessA参数设置为TRUE而不是NULL,以使调用过程中的每个可继承句柄都被新过程继承(这里是cmd.exe)。
  1. cmd.exe显示启动和退出后的版本信息。如果要防止退出,可以设置cmd.exe的命令行以使其连续运行。
  • 提示:

    功能失败后立即调用GetLastError(),否则其他功能可能会将错误代码设置为GetLastError()

    以下是我的示例工作。您可以尝试。

    zero

  • © www.soinside.com 2019 - 2024. All rights reserved.