我怎样才能在Linux上用C ++读取()和O_DIRECT文件?

我正在寻找解决scheme来解决上述问题。

这是我的“不工作的代码”。 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; 

O_DIRECT fd中readO_DIRECT的“用户缓冲区的对齐方式和文件偏移量必须全部是文件系统的逻辑块大小的倍数”(引自open手册页 )。 其他环境可能对此有不同的限制,实际上它依赖于文件系统。

一般来说, new的情况并非如此(除非你幸运)。

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

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

有关参考,请参阅LKML上的此线程或上面引用的手册页的“注释”部分。