Есть ли не буферизованный ввод-вывод в системе Windows?

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

буферизованный ввод-вывод, такой как fread, fwrite, - это не то, что я хотел.

5 ответов


посмотреть CreateFile с параметром FILE_FLAG_NO_BUFFERING


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=против 85).aspx

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


эквивалентность Win32 функции POSIX write () равна WriteFile(). Документация рекомендует использовать не буферизованный файл ввода-вывода и рекомендует на этой странице для получения дополнительной информации.


потоки примерно на таком низком уровне, как вы можете получить.. и они!--3-->can быть без наручников.

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

пример

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

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

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

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

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

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

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


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