我想找到没有缓冲区的低级 C/C++ API,相当于 linux 系统中的“write”。有吗?
fread、fwrite 等缓冲 I/O 不是我想要的。
使用 FILE_FLAG_NO_BUFFERING 选项查看CreateFile
http://www.codeproject.com/Articles/51678/Improve-responsiveness-in-Windows-with-the-FILE_FL
防止换出缓存的唯一方法是打开带有FILE_FLAG_NO_BUFFERING
标志的文件。然而,这要求磁盘 I/O 请求的大小可以被扇区大小(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
可以指定标志来禁用系统缓存正在读取或写入文件的数据。尽管这可以完全直接地控制数据 I/O 缓冲,但对于文件和类似设备,必须考虑数据对齐要求。
POSIX write() 函数的 Win32 等效项是WriteFile()
. 该文档建议使用非缓冲文件 I/O,并推荐此页面以获取更多信息。
流大约是您可以获得的最低级别..并且它们可以是无缓冲的。
int setvbuf( 文件*流, 字符 * 缓冲区, 整数模式, size_t 大小 );
例子
setvbuf(stdout, (char *)NULL, _IONBF, 0); //无缓冲的标准输出
这是 vc2008 帮助文档的摘录。
setvbuf 函数允许程序控制流的缓冲和缓冲区大小。stream 必须引用自打开后未进行 I/O 操作的打开文件。buffer 指向的数组用作缓冲区,除非它为 NULL,在这种情况下 setvbuf 使用自动分配的长度为 size/2 * 2 字节的缓冲区。
模式必须是_IOFBF、_IOLBF或_IONBF。如果 mode 是_IOFBF或_IOLBF,则 size 用作缓冲区的大小。如果 mode 为 _IONBF,则流是无缓冲的,并且忽略大小和缓冲区。mode 的值及其含义是:
_IOFBF 全缓冲;即buffer作为缓冲区,size作为缓冲区的大小。如果缓冲区为 NULL,则使用自动分配的缓冲区大小字节长。
_IOLBF 对于某些系统,这提供了行缓冲。但是,对于 Win32,行为与 _IOFBF - Full Buffering 相同。
_IONBF 不使用缓冲区,无论缓冲区或大小如何。
您可以使用_write
MSDN Page Here。