在子进程处于活动状态时读取子进程的输出
read child process's output while it is alive
我创建了两个管道
saAttr.bInheritHandle = TRUE;
...
CreatePipe(&childStdOut_Rd, &childStdOut_Wr, &saAttr, 0);
CreatePipe(&childStdErr_Rd, &childStdErr_Wr, &saAttr, 0);
然后我用下一个启动信息创建了子进程:
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_MINIMIZE;
si.hStdError = childStdErr_Wr;
si.hStdOutput = childStdOut_Wr;
si.hStdInput = INVALID_HANDLE_VALUE;
si.dwFlags |= STARTF_USESTDHANDLES;
然后关闭父进程中的写入句柄: 关闭手柄(childStdErr_Wr); 关闭手柄(childStdOut_Wr);
我等待子进程完成
WaitForSingleObject(pi.hProcess, INFINITE);
当我在MSDN上阅读时,我可以通过以下方式阅读chil process的stdout:
for (;;)
{
BOOL bSuccess = ReadFile(childStdOut_Rd, chBuf, bufsize, &dwRead, NULL);
if(!bSuccess || dwRead == 0) break;
bSuccess = WriteFile(hParentStdOut, chBuf, dwRead, &dwWritten, NULL);
if (!bSuccess) break;
}
问:但是我必须在哪里放置代码才能读取孩子的输出?
为什么我不能用这些管道读取 cout 和 printf?
像这样我猜..
ChildProcess -- main.cpp:
#include <iostream>
#include <windows.h>
int main()
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
if (!hOut)
return 0;
DWORD WriteCount = 0;
char Buffer[1024] = {0};
strcat(&Buffer[0], "Hello? Momma?!");
int Length = strlen(Buffer);
for (int i = 0; i < 10; ++i)
{
if (!WriteFile(hOut, Buffer, Length, &WriteCount, 0))
break;
}
return 0;
}
父进程 -- 主进程.cpp
#include <iostream>
#include <windows.h>
void RedirectIO(HANDLE &hRead, HANDLE &hWrite)
{
SECURITY_ATTRIBUTES attr;
ZeroMemory(&attr, sizeof(attr));
attr.nLength = sizeof(attr);
attr.bInheritHandle = true;
CreatePipe(&hRead, &hWrite, &attr, 0);
SetHandleInformation(hRead, HANDLE_FLAG_INHERIT, 0);
}
bool CreateChild(std::string CommandLine, DWORD WaitTime, HANDLE hInRead, HANDLE hOutWrite)
{
STARTUPINFO SI;
PROCESS_INFORMATION PI;
ZeroMemory(&SI, sizeof(SI));
ZeroMemory(&PI, sizeof(PI));
SI.cb = sizeof(SI);
SI.hStdError = hOutWrite;
SI.hStdInput = hInRead;
SI.hStdOutput = hOutWrite;
SI.dwFlags |= STARTF_USESTDHANDLES;
bool success = CreateProcess(0, const_cast<char*>(CommandLine.c_str()), 0, 0, true, NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW, 0, 0, &SI,&PI);
if (success)
{
WaitForSingleObject(PI.hProcess, WaitTime);
CloseHandle(PI.hProcess);
CloseHandle(PI.hThread);
}
return success;
}
int main()
{
HANDLE hRead = nullptr;
HANDLE hWrite = nullptr;
RedirectIO(hRead, hWrite);
CreateChild("C:/Users/School/Desktop/ChildProcess/bin/Debug/ChildProcess.exe", INFINITE, nullptr, hWrite);
DWORD ReadCount = 0;
char Buffer[1024] = {0};
std::string data = std::string();
while(true)
{
if (!ReadFile(hRead, Buffer, sizeof(Buffer) / sizeof(char), &ReadCount, 0))
break;
if (!ReadCount) break;
Buffer[ReadCount] = ' ';
data.append(&Buffer[0], ReadCount);
std::cout<<"Read From Child:nn"<<data<<"n";
}
return 0;
}
它应该打印Hello? Momma?!
10次。另一种选择是将读数放在WaitForSingleObject
之后,这样您就不会立即关闭该过程,并且可以继续与之通信。甚至可以创建一个线程并在该线程中读取,或者让线程生成进程并读取。轮到你了。
相关文章:
- 终止 QProcess 不会终止子进程
- 如何使用带有矢量的 winapi 读取进程内存从另一个进程读取缓冲区?
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 子进程更新共享 mmap 内存,但父进程没有更改
- 使用 waitpid 时等待子进程终止
- 使用重定向标准处理子进程中的 kbhit
- 由 JOB 中的进程启动的子进程是否可以将 JOB 属性设置为脱离作业?
- 是否可以将子进程的 stdout 重定向到父进程中的另一个文件?
- kill() 总是返回 0(成功),即使在子进程已经结束之后?
- 父进程和子进程之间的 POSIX 信号量
- 从stdin读取时子进程挂起(fork/dup2竞争条件)
- 启动子进程时的争用条件导致从管道读取挂起
- C++双向管道-在循环中尝试从子进程读取时卡住
- 在子进程处于活动状态时读取子进程的输出
- Windows:如何让子进程在不关闭输入匿名管道的情况下读取它
- 从 Python 子进程中的 stdin 读取挂起在 C++/Python IPC 中
- 当子进程不刷新其stdout时,如何从子进程读取stdout
- 我们可以从父进程读取子进程的环境变量吗
- 子进程被满管道阻塞,无法读取父进程
- 如何从子进程读取返回代码