写入非阻塞的字节模式时 缓冲区空间不足的管道句柄,WriteFile返回TRUE,* lpNumberOfBytesWritten< nNumberOfBytesToWrite。
对于文件或套接字( not pipe ),当我同时调用函数 时,* lpNumberOfBytesWritten可以小于nNumberOfBytesToWrite(并且结果为TRUE)。
如果是这样,为什么(和什么时候)对应的驱动程序会像那样完成IRP?
当我看到下面的代码时,我总是担心“如果* lpNumberOfBytesWritten< BytesToWrite会怎么样?”
BOOL fOk = WriteFile(hFileOrSocket, ...); // Synchronously
if (fOk)
{
// It assumes everything is fine
}
我不需要担心吗?
答案 0 :(得分:2)
AFAIK如果为同步写入打开了文件句柄 - 您描述的情况(*lpNumberOfBytesWritten < BytesToWritten
)将永远不会发生。
部分写入的重点是让您有机会在失败之前编写部分数据,例如WSAEWOULDBLOCK
或类似错误。异步I / O模型表示尽可能多地写入,直到得到适当的错误,然后等到某些I / O完成。
不要与重叠的I / O混淆。在那里,您可以安排I / O并以异步方式完成(通过底层驱动程序)。
答案 1 :(得分:0)
“对于文件或套接字(不是管道),”
对于一个文件,应该很容易想象。
实验也很容易。创建一个大小为100 MB的硬盘分区,打开一个文件,写入99 MB,然后尝试再写99 MB。该实验可能不可靠,因为某些版本的Windows可能会返回FALSE,但很容易想象其他版本的Windows可能会返回TRUE且* lpNumberOfBytesWritten小于nNumberOfBytesToWrite。