我试图准确地确定使用C / C ++库的用户空间程序与操作系统(及其组件,如文件系统的页面缓存或磁盘缓存)之间的某些交互。我有两个问题。
首先,"无缓冲"在C / C ++库中相当于"没有预读"并且"没有缓存"在操作系统中。还是我遭受了脱节?
其次,是否可以使用C ++的流执行未缓存的文件操作和无缓冲的读取?如果是这样,一个人怎么做,因为似乎没有任何open flags与之相关?
我问的原因类似于以下内容。我正在使用提供与C ++流集成的C ++库,我想确保我没有得到任何无意的副作用。
ifstream("/dev/random");
...
如果流触发读取块或扇区大小(如4K或8K)但我只需要32个字节,那么我就浪费了很多潜在的熵。我甚至可能耗尽它和DoS以及其他程序。
我觉得这个问题可能已经被问到并得到了解答,但我找不到运气。
这是一个相关的问题(感谢Dietmar):How to disable buffering on a stream?。但它没有解决或讨论因操作系统或文件系统预读和缓存而可能出现的意外副作用。
答案 0 :(得分:3)
在文件流上,您可以使用
将流设置为不使用缓冲区std::ifstream in;
in.rdbuf()->pubsetbuf(0, 0);
in.open("/dev/random");