我正在寻找解决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中read
, O_DIRECT
的“用户缓冲区的对齐方式和文件偏移量必须全部是文件系统的逻辑块大小的倍数”(引自open
手册页 )。 其他环境可能对此有不同的限制,实际上它依赖于文件系统。
一般来说, new
的情况并非如此(除非你幸运)。
如果你的平台具有这个功能,你应该考虑使用posix_memalign
函数,或者简单地分配一个更大的缓冲区(BLOCK_SIZE + BUFSIZE)并使用它的块大小对齐的部分。
如果你想坚持new
,你将需要使用某种形式的新的结合上述,但我不够熟悉,以显示如何工作。
有关参考,请参阅LKML上的此线程或上面引用的手册页的“注释”部分。