繁体   English   中英

Windows 系统中是否有无缓冲 I/O?

[英]Is there an un-buffered I/O in Windows system?

我想找到没有缓冲区的低级 C/C++ API,相当于 linux 系统中的“写入”。 有吗?

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 function 打开或创建文件时,可以指定FILE_FLAG_NO_BUFFERING标志来禁用从文件读取或写入文件的数据的系统缓存。 尽管这可以完全直接地控制数据 I/O 缓冲,但对于文件和类似设备,必须考虑数据 alignment 要求。

POSIX write() function 的 Win32 等效项是WriteFile() 该文档建议使用非缓冲文件 I/O,并推荐此页面以获取更多信息。

流大约是您可以获得的最低级别..并且它们可以是无缓冲的。

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

例子

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

这是 vc2008 帮助文档的摘录。

setvbuf function 允许程序控制 stream 的缓冲和缓冲区大小。 stream 必须引用自打开后未进行 I/O 操作的打开文件。 buffer 指向的数组被用作缓冲区,除非它是 NULL,在这种情况下 setvbuf 使用长度为 size/2 * 2 字节的自动分配的缓冲区。

模式必须是_IOFBF_IOLBF_IONBF 如果 mode 是_IOFBF_IOLBF ,则 size 用作缓冲区的大小。 如果模式为 _IONBF,则 stream 无缓冲,大小和缓冲区将被忽略。 mode 的值及其含义是:

_IOFBF全缓冲; 即buffer作为缓冲区,size作为缓冲区的大小。 如果缓冲区是 NULL,则使用自动分配的缓冲区大小字节长。

_IOLBF对于某些系统,这提供了行缓冲。 但是,对于 Win32,行为与 _IOFBF - Full Buffering 相同。

_IONBF不使用缓冲区,无论缓冲区或大小如何。

您可以使用_write MSDN Page Here

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM