gpt4 book ai didi

c++ - 为什么 ReadFile() 不返回 0 ?程序试图永远从管道中读取数据

转载 作者:行者123 更新时间:2023-11-30 03:01:33 45 4
gpt4 key购买 nike

代码:

这来自更大的 MS 示例 (http://msdn.microsoft.com/en-us/library/ms682499(VS.85).aspx)。当然,我之前尝试过整个示例,下面的片段是我将其剥离到问题所在的地方。问题是如果我得到的只是 1,我应该如何跳出这个循环。如何发出没有更多数据可读的信号?

(编译器是 MiGW。)

看起来 MS 示例已损坏,这是那里的评论之一:父进程需要关闭在调用 CreateProcess() 后传递给子进程的句柄。不这样做会导致父级永远等待 ReadFile()。

#include <iostream>
#include <windows.h>
using namespace std;

int main() {
cout << "\n->Start of parent execution.\n";
SECURITY_ATTRIBUTES saAttr;
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
HANDLE g_hChildStd_OUT_Rd = NULL;
HANDLE g_hChildStd_OUT_Wr = NULL;
CreatePipe(&g_hChildStd_OUT_Rd, &g_hChildStd_OUT_Wr, &saAttr, 0);

STARTUPINFO siStartInfo;
PROCESS_INFORMATION piProcInfo;

ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) );
siStartInfo.hStdOutput = g_hChildStd_OUT_Wr;
siStartInfo.dwFlags |= STARTF_USESTDHANDLES;

CreateProcess(NULL,
(char*)"cmd /c dir", // command line
NULL, // process security attributes
NULL, // primary thread security attributes
TRUE, // handles are inherited
0, // creation flags
NULL, // use parent's environment
NULL, // use parent's current directory
&siStartInfo, // STARTUPINFO pointer
&piProcInfo); // receives PROCESS_INFORMATION


CHAR chBuf[4096];
DWORD dwRead;

// ~~~~~~this loop here~~~~~- how to break out of it ?
while(true) {
cout << "ReadFile: " << ReadFile( g_hChildStd_OUT_Rd, chBuf, 4096, &dwRead, NULL) << endl;
}

cout << "\n->End of parent execution.\n";
}

最佳答案

您是否尝试了所有代码? MSDN 有一些处理继承的东西。看起来管道的写端没有关闭,所以 ReadFile 认为如果等待的话会有更多的东西要读。

编辑:

“关闭句柄(g_hChildStd_OUT_Wr);”使读取一旦读取所有内容就终止,所以问题似乎是子进程终止后写端永远不会完全关闭。但是 MSDN 示例似乎并不需要它,因此您需要更仔细地查看为什么会这样。

关于c++ - 为什么 ReadFile() 不返回 0 ?程序试图永远从管道中读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10977024/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com