以VirtualBox的虚拟磁盘为例:如果VirtualBox没有从主机操作系统中的FileSystem中避开缓冲机制,则guest虚拟机操作系统中的FileSystem会将数据从内存移动到meory。
事实上,我想在用户空间中编写文件系统(将所有directorys和文件放在一个大文件中)。但是如果我使用 c api这样的fread和fwrite ,os中的FileSystem会缓冲我的UserSpace-FileSystem读取的数据,写。但是我的UserSpace-FileSystem自己实现了一个缓冲机制。如果我没有从OS中的FileSystem中避免缓冲机制,My UserSpace-FileSystem会将数据从内存移动到内存。这太糟糕了。
任何人都知道如何解决这个问题?
答案 0 :(得分:4)
stdio
不支持。
对于* NIX:man open
代表O_DIRECT,man fadvise
和man madvise
。
对于Windows,请查看FILE_FLAG_NO_BUFFERING
{{1}}。可能也是挖掘CreateFile
的好主意。
答案 1 :(得分:1)
您的问题不是很明确,但如果您只想使用stdio
而不进行缓冲,那么setbuf(file, NULL);
将解决您的问题。一个更好的解决方案可能是完全避免stdio
并使用较低级别的io原语read
,write
等(不是普通C的一部分,但是由POSIX指定,并且几乎相当于它们的版本也适用于大多数非POSIX系统。)