Есть ли небуферизованный ввод / вывод в системе Windows? - PullRequest
9 голосов
/ 31 марта 2009

Я хочу найти низкоуровневые API C / C ++, эквивалентные «write» в системах Linux, которые не имеют буфера. Есть один?

Буферизованный ввод / вывод, такой как fread, fwrite, не тот, который я хотел.

Ответы [ 5 ]

14 голосов
/ 31 марта 2009

Посмотрите на CreateFile с параметром FILE_FLAG_NO_BUFFERING

5 голосов
/ 10 ноября 2012

http://www.codeproject.com/Articles/51678/Improve-responsiveness-in-Windows-with-the-FILE_FL

Единственный способ предотвратить выгрузку кэша - открыть файлы с флагом FILE_FLAG_NO_BUFFERING. Это, однако, требует, чтобы запросы дискового ввода-вывода имели размеры, кратные размеру сектора (от 512 до 4096 байт), что потребовало бы больших переписываний большинства приложений, которые полагаются на возможность запрашивать разные размеры.

Этот проект содержит встроенную оболочку, которая предлагает функции CreateFile_NB(), ReadFile_NB(), WriteFile_NB() и CloseHandle_NB(), которые занимаются организацией очередей и регулировкой размера файла при закрытии файла, открытого для записи.

http://msdn.microsoft.com/en-us/library/cc644950(v=vs.85).aspx

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

4 голосов
/ 31 марта 2009

Эквивалентность Win32 функции POSIX write () равна <a href="http://msdn.microsoft.com/en-us/library/aa365747%28VS.85%29.aspx" rel="nofollow noreferrer">WriteFile()</a>. В документации рекомендуется использовать небуферизованный файловый ввод-вывод, а также эту страницу для получения дополнительной информации.

2 голосов
/ 31 марта 2009

Вы можете использовать _write Страница MSDN здесь .

2 голосов
/ 31 марта 2009

потоки примерно на таком низком уровне, как вы можете получить .. и они могут быть небуферизованными.

int setvbuf(
   FILE *stream,
   char *buffer,
   int mode,
   size_t size 
);

Пример

  setvbuf(stdout, (char *)NULL, _IONBF, 0); //unbuffered stdout

вот выдержка из справочного документа vc2008.

Функция setvbuf позволяет программе контролировать как буферизацию, так и размер буфера для потока. Поток должен ссылаться на открытый файл, который не подвергался операции ввода-вывода с момента его открытия. Массив, на который указывает буфер, используется в качестве буфера, если он не равен NULL, и в этом случае setvbuf использует автоматически выделенный буфер длиной / 2 * 2 байта.

Режим должен быть _IOFBF , _IOLBF или _IONBF . Если режим _IOFBF или _IOLBF , то размер используется в качестве размера буфера. Если режим равен _IONBF, поток не буферизируется, а размер и буфер игнорируются. Значения для режима и их значения:

_IOFBF Полная буферизация; то есть буфер используется в качестве буфера, а размер используется в качестве размера буфера. Если буфер равен NULL, используется автоматически выделенный размер буфера в байтах.

_IOLBF Для некоторых систем это обеспечивает буферизацию строки. Однако для Win32 поведение такое же, как _IOFBF - полная буферизация.

_IONBF Буфер не используется, независимо от буфера или размера.

...