我用它创建了两个管道
saAttr.bInheritHandle = TRUE;
...
CreatePipe(&childStdOut_Rd, &childStdOut_Wr, &saAttr, 0);
CreatePipe(&childStdErr_Rd, &childStdErr_Wr, &saAttr, 0);
然后我用下一个STARTUPINFO创建了子进程:
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;
然后在父进程中关闭写句柄:CloseHandle(childStdErr_Wr); CloseHandle的(childStdOut_Wr);
我等孩子过程结束了
WaitForSingleObject(pi.hProcess, INFINITE);
正如我在MSDN上阅读的那样,我可以阅读chil进程的标准输出:
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;
}
Q: 但是我必须把代码放到读取孩子的输出?
为什么我不能用这些管道阅读cout和printf?
1 回答
像这样我猜...
ChildProcess -- main.cpp :
ParentProcess -- main.cpp
它应打印
Hello? Momma?!
10次..另一个选项是WaitForSingleObject
之后的读取位置,这样您就不会立即关闭该过程,并且可以继续与之通信 . 也许甚至创建一个线程并读入该线程或让线程产生进程并读取..由你决定 .