在Windows中,可以使用以下方法读取子进程的stdout:
以下是一个示例代码:
#include <windows.h>
#include <iostream>
int main()
{
SECURITY_ATTRIBUTES saAttr;
HANDLE hChildStdoutRead = NULL;
HANDLE hChildStdoutWrite = NULL;
// 创建匿名管道
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
if (!CreatePipe(&hChildStdoutRead, &hChildStdoutWrite, &saAttr, 0))
{
std::cerr << "CreatePipe failed" << std::endl;
return 1;
}
// 设置管道写入端口为不可继承
if (!SetHandleInformation(hChildStdoutWrite, HANDLE_FLAG_INHERIT, 0))
{
std::cerr << "SetHandleInformation failed" << std::endl;
return 1;
}
// 创建子进程
PROCESS_INFORMATION piProcInfo;
STARTUPINFO siStartInfo;
BOOL bSuccess = FALSE;
ZeroMemory(&piProcInfo, sizeof(PROCESS_INFORMATION));
ZeroMemory(&siStartInfo, sizeof(STARTUPINFO));
siStartInfo.cb = sizeof(STARTUPINFO);
siStartInfo.hStdError = hChildStdoutWrite;
siStartInfo.hStdOutput = hChildStdoutWrite;
siStartInfo.dwFlags |= STARTF_USESTDHANDLES;
bSuccess = CreateProcess(NULL,
"your_command", // 替换为要执行的命令
NULL,
NULL,
TRUE,
0,
NULL,
NULL,
&siStartInfo,
&piProcInfo);
if (!bSuccess)
{
std::cerr << "CreateProcess failed" << std::endl;
return 1;
}
// 关闭不需要的管道句柄
CloseHandle(hChildStdoutWrite);
// 读取子进程的输出
const int BUFFER_SIZE = 4096;
char buffer[BUFFER_SIZE];
DWORD bytesRead = 0;
std::string output;
while (true)
{
bSuccess = ReadFile(hChildStdoutRead, buffer, BUFFER_SIZE, &bytesRead, NULL);
if (!bSuccess || bytesRead == 0)
break;
output.append(buffer, bytesRead);
}
// 输出子进程的输出
std::cout << "Child process output: " << output << std::endl;
// 等待子进程退出
WaitForSingleObject(piProcInfo.hProcess, INFINITE);
// 关闭进程和管道句柄
CloseHandle(piProcInfo.hProcess);
CloseHandle(piProcInfo.hThread);
CloseHandle(hChildStdoutRead);
return 0;
}
请注意,上述示例代码仅演示了如何在Windows中读取子进程的stdout,并不涉及云计算相关内容。
领取专属 10元无门槛券
手把手带您无忧上云