0

我无法控制的这段代码使用重叠 I/O 读取文件:

// Read file asynchronously
HANDLE hFile = CreateFile(..., FILE_FLAG_OVERLAPPED, ...);
BYTE buffer[10];
OVERLAPPED oRead = { 0 };
ReadFile(hFile, buffer, 10, NULL, &oRead);

// Do work while file is being read
...

// Wait for read to finish
WaitForSingleObject(hFile, INFINITE);

// ReadFile has finished 
// buffer now contains data which can be used
...

在另一个线程中(实际上是在 ReadFile 的 API 挂钩中),我需要发出信号hFile来解除对WaitForSingleObject. 通常 Windows(或处理 的设备驱动程序ReadFile)会这样做,但我需要模拟它。

我发现没有一个 API 通常可以与 . 一起使用hFile,包括ReleaseMutexReleaseSemaphoreSetEvent. 它们都返回错误 6(句柄无效)。是否有适用于文件、命名管道或通信设备的 API?

我知道不建议这样做WaitForSingleObject(hFile),但上面的代码是给定的,我需要使用它。谢谢!

4

1 回答 1

0

据我所知,文件句柄的信号发生在 Windows 内部,即使在内核模式下运行也没有 API。(我相信文件系统驱动程序只是告诉 Windows 操作已完成,并让 Windows 弄清楚如何通知用户模式进程。我可能错了。)

一种解决方案是针对句柄发出真正的 ReadFile(零字节读取可能就足够了)以发出信号。

但是挂钩 WaitForSingleObject 可能更明智,检查是否在相关文件句柄上调用它,如果是,则根据需要修改行为。

于 2015-12-19T22:36:08.343 回答