如何在Linux上用C++读取带有read()和O_DIRECT的文件?

sil*_*der 2 c++ linux file

我正在寻找解决上述问题的解决方案.

这是我的"不工作代码".charsInCurrentBuffer总是返回-1!

#define BUFSIZE 512

char *bufferA = new char[BUFSIZE];
char *bufferB = new char[BUFSIZE];

const char *inputFile = "in.txt";

if ( (fdInputFile = open(inputFile, O_DIRECT) ) != -1) {
    cout << "input opened!" << endl;
} else {
    cout << "can't open input file!";
}

int charsInCurrentBuffer = read(fdInputFile, currBuffer, BUFSIZE);
cout << charsInCurrentBuffer << endl;
Run Code Online (Sandbox Code Playgroud)

Mat*_*Mat 7

当你readO_DIRECTFD中,"用户缓冲区的排列和文件偏移量都必须是文件系统的逻辑块大小的倍数"(引自open手册页在Linux上).其他环境可能对此有不同的约束,实际上它依赖于文件系统.

new一般情况下情况并非如此(除非你很幸运).

posix_memalign如果你的平台有这个功能,你应该考虑使用一个函数,或者只是分配一个更大的缓冲区(BLOCK_SIZE + BUFSIZE)并使用它的块大小对齐部分.

如果你想坚持下去new,你将需要使用某种形式的位置新结合上述,但我不熟悉它,以显示它将如何工作.

有关参考,请参阅LKML上的线程或上述手册页的Notes部分.