WriteFile 函数的 lpNumberOfBytesWritten 参数

Ben*_*min 5 sockets windows filesystems file-io winapi

MSDN 说,

当写入缓冲区空间不足的非阻塞字节模式 管道句柄时,WriteFile 返回 TRUE,且 *lpNumberOfBytesWritten < nNumberOfBytesToWrite。

对于文件或套接字(不是管道),当我同步调用该函数时, *lpNumberOfBytesWritten 可以小于 nNumberOfBytesToWrite (并且结果为 TRUE)。

如果是这样,为什么(以及何时)相应的驱动程序会像这样完成 IRP?

当我看到下面的代码时,我总是担心“如果 *lpNumberOfBytesWritten < BytesToWrite 会怎样?”

BOOL fOk = WriteFile(hFileOrSocket, ...); // Synchronously
if (fOk)
{
  // It assumes everything is fine
}
Run Code Online (Sandbox Code Playgroud)

我不需要担心这个吗?

val*_*ldo 2

AFAIK 如果打开文件句柄进行同步写入 - 您描述的情况 ( *lpNumberOfBytesWritten < BytesToWritten) 将永远不会发生。

部分写入的全部目的是让您有机会在因类似或类似错误而失败之前写入部分数据WSAEWOULDBLOCK。异步 I/O 模型表示尽可能多地写入,直到收到适当的错误,然后等待某些 I/O 完成。

不要与重叠 I/O 混淆。在那里您可以调度 I/O,它会异步完成(由底层驱动程序)。