Может ли Windows ReadFile вернуть успех, не прочитав все, что вы просили? - PullRequest
0 голосов
/ 25 мая 2018

В мире Unix хорошо известно, что чтение из файлового дескриптора может быть успешным и не даст вам все данные, которые вы запрашивали.Вы должны специально проверить.

Мне интересно, верно ли то же самое в Windows.Мы выполняем синхронное чтение, ничего асинхронного не происходит, но мы используем перекрывающуюся структуру, чтобы мы могли указать и смещение, и длину для чтения.

This ...

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365467(v=vs.85).aspx

говорит:

Функция ReadFile возвращается, когда происходит одно из следующих условий: прочитано число запрошенных байтов.

, а также:

Если lpOverlapped не равно NULL, операция чтения начинается со смещения, указанного в структуре OVERLAPPED, и ReadFile не возвращается, пока операция чтения не будет завершена.Система обновляет смещение OVERLAPPED до того, как ReadFile вернет.

И, наконец, говорится:

Для параметра lpNumberOfBytesRead должно быть установлено значение NULL.Используйте функцию GetOverlappedResult, чтобы получить фактическое количество прочитанных байтов.

Но на самом деле происходит успешное возвращение, но количество прочитанных байтов (от вызова GetOverlappedResult) меньше, чем мы просили.

Нигде в этой документации даже не подразумевается, что это может произойти, но это, безусловно, происходит.

Что я делаю не так?

1 Ответ

0 голосов
/ 27 мая 2018

Этот тип говорит сам за себя:

https://blogs.msdn.microsoft.com/oldnewthing/20150121-00/?p=44863

моя любимая цитата: "Чтобы уменьшить путаницу, документация была бы более понятной, если бы она не переключала терминологию на средний уровень".

Мы, очевидно, используем то, что они называют «гибридной моделью».

И отличительной особенностью гибридной модели является то, что она плохо документирована, а там, где она задокументирована, она вводит в заблуждение.И, кажется, никто не удосужился исправить это с 2015 года.

Это хороший пример того, почему вы не должны пытаться перегрузить одну функцию, чтобы делать много разных вещей, даже если по своей сути они читают.'Вы делаете исключение за исключением для каналов и вещей, которые имеют положение и вещи, которые могут быть выполнены асинхронно синхронным способом, и вы просто получаете беспорядок.Введите Win32 API.

...