在unix世界中,一个众所周知的知识是,从文件描述符读取可能会成功,而不会产生您要求的所有数据。你必须专门检查。
我想知道在Windows中是否也是如此。 我们正在进行同步读取,没有任何异步,但我们正在使用重叠结构,因此我们可以指定和偏移以及读取长度。
此...
https://msdn.microsoft.com/en-us/library/windows/desktop/aa365467(v=vs.85).aspx
表示:
当出现以下某种情况时,ReadFile函数会返回: 读取请求的字节数。
它还说:
如果lpOverlapped不为NULL,则读取操作从OVERLAPPED结构中指定的偏移量开始,并且ReadFile在读取操作完成之前不会返回。系统在ReadFile返回之前更新OVERLAPPED偏移量。
最后说:
lpNumberOfBytesRead参数应设置为NULL。使用GetOverlappedResult函数获取读取的实际字节数。
但实际发生的事情是我们获得了成功的回报,但读取的字节数(来自调用GetOverlappedResult)比我们要求的要少。
这篇文档中没有任何地方甚至暗示可能会发生,但肯定会发生。
我做错了什么?
答案 0 :(得分:0)
这种说法全是:
https://blogs.msdn.microsoft.com/oldnewthing/20150121-00/?p=44863
我最喜欢的一句话:"为了减少混淆,如果文档没有在中途切换术语,那么文档会更清晰。"
我们显然正在使用他们所谓的"混合型号。"
混合模型的独特之处在于它没有得到很好的记录,而且在记录的地方,它具有误导性。自2015年以来,似乎没有人愿意解决这个问题。
这是一个很好的例子,说明为什么你不应该尝试重载一个函数来执行许多不同的事情,即使它们是核心,它们也会阅读。' 你对管道的异常,以及有位置的东西以及可以以同步的方式异步完成的事情做出异常,你最终会弄得一团糟。输入Win32 api。