我正在尝试使用重定向的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,但程序仅退出且子进程没有弹出窗口,即使它在后台运行也无法写入。
根据您所代表的代码,发现两个问题:
CreateProcessA
参数设置为TRUE
而不是NULL
,以使调用过程中的每个可继承句柄都被新过程继承(这里是cmd.exe
)。cmd.exe
显示启动和退出后的版本信息。如果要防止退出,可以设置cmd.exe
的命令行以使其连续运行。功能失败后立即调用GetLastError()
,否则其他功能可能会将错误代码设置为GetLastError()
。
以下是我的示例工作。您可以尝试。
zero