Есть ли не буферизованный ввод-вывод в системе Windows?
Я хочу найти низкоуровневые API C / C++, эквивалентные "write" в системах linux, которые не имеют буфера. Есть такой?
буферизованный ввод-вывод, такой как fread, fwrite, - это не то, что я хотел.
5 ответов
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 Буфер не используется, независимо от буфера или размера.