ReadFile()可能有一个超时?

while(GetExitCodeProcess(processInfo.hProcess, &exitCode) && exitCode == STILL_ACTIVE) { ReadFile(defaultSTDIN, chBuf, 1, &dwRead, 0); WriteFile(writingEnd, chBuf, 1, &dwWritten, 0); } 

上面的代码的问题是,即使通过processInfo.hProcess引用的subprocess退出,我们仍然卡在while循环,因为ReadFile()正在等待input。 最好的解决办法是什么?

您需要的是在打开文件时使用FILE_FLAG_OVERLAPPED标志异步读取文件,并指定ReadFile函数的OVERLAPPED结构。 然后,您可以等待读取操作和进程终止,并采取适当的行动。

可以假定一个非重叠ReadFile超时,但间接。

首先,您必须使用SetCommTimeouts来设置句柄的超时时间,具体而言,必须至少有一个设置为传递给此函数的ReadTotalTimeoutConstant的值。 (一个警告:当你的句柄指向一个通信端口时,这是有效的,如果这个文件实际上是一个被读取的文件,不知道它是如何工作的。)

如果设置得当, ReadFile函数会在完成填充缓冲区,到达文件结束位置或到达超时位置时弹出。 它不会抛出任何错误或任何东西,以确定超时发生,你需要比较你的&dwRead与期望的字节数。 因为你只是在寻找1个字节, if dwRead = 0那么你有一个超时,而不是文件的结尾。

所以我写这个(我不能说我遵循最佳实践或任何其他)的方式是做以下事情:

  COMMTIMEOUTS timeouts = { 0, //interval timeout. 0 = not used 0, // read multiplier 10, // read constant (milliseconds) 0, // Write multiplier 0 // Write Constant }; SetCommTimeouts(defaultSTDIN, &timeouts); while(GetExitCodeProcess(processInfo.hProcess, &exitCode) && exitCode == STILL_ACTIVE) { ReadFile(defaultSTDIN, chBuf, 1, &dwRead, 0); if (dwRead == 0) { //insert code to handle timeout here } WriteFile(writingEnd, chBuf, 1, &dwWritten, 0); }