WriteFile с перекрывающимся вводом-выводом и ERROR_DISK_FULL? - PullRequest
0 голосов
/ 10 июля 2019

Интересно, если кто-нибудь знает внутренний дизайн WriteFile() (Storage Team Here?) С перекрывающимся вводом-выводом для файла на диске / файловой системе.Ясно, что при использовании системного буфера и стандартного синхронного WriteFile() он проверяет полный диск и выделяет пространство перед возвратом, потому что системный кэш, содержащий фактические данные, записывается позже (проблема вызывает ошибку отложенной записи из ОС).

Таким образом, вопрос: будет ли то же самое при использовании OVERLAPPED структуры для асинхронной WriteFile(), которая расширяет файл за пределы свободного пространства?Например, он вернул бы ERROR_DISK_FULL прямо перед ожиданием ввода-вывода?

Причина, по которой нужно это знать, - это восстановление свободного места на диске или вставка нового носителя и возобновление записи.Если все сделано таким образом, это довольно просто, если после ожидания ввода-вывода у вас может быть куча операций ввода-вывода в очереди, которые затем должны быть синхронизированы и дополнительная информация отслеживается для всех элементов в очереди в случае перехода на новый носитель для настройки смещений и тому подобного..

TIA !!

Ответы [ 2 ]

3 голосов
/ 10 июля 2019

Что вы подразумеваете под асинхронными файловыми операциями (WriteFile() и т. Д.) - эти операции являются только асинхронными для вызывающей стороны. Внутренне они работают так же, как и синхронные (блокирующие). Реализация блокирующего вызова вызывает неблокирующий вызов и ожидает события так же, как если бы вы использовали структуру OVERLAPPED. Итак, на ваш вопрос о том, вернет ли WriteFile ERROR_DISK_FULL перед ожиданием ввода-вывода, ответ - нет. Обоснование неблокирующих вызовов состоит не в том, чтобы ускорить возврат результатов работы диска, а в том, чтобы разрешить один поток выполнять несколько операций ввода-вывода параллельно без необходимости создавать несколько потоков.

2 голосов
/ 10 июля 2019

если на диске недостаточно места для завершения операции записи - вы получите ERROR_DISK_FULL (STATUS_DISK_FULL) после завершения операции ввода-вывода.драйвер файловой системы просто завершает ваш запрос на запись с STATUS_DISK_FULL (преобразованным в ERROR_DISK_FULL) или сначала возвращает STATUS_PENDING (преобразованным в ERROR_IO_PENDING с помощью win32), а затем завершает ввод / вывод с STATUS_DISK_FULL - это не определен .может быть какокончательное состояние будет ERROR_DISK_FULL, но вы не можете предполагать, что операция завершится синхронно или асинхронно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...