我正在寻找解决上述问题的解决方案。
这是我的“无效代码”。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;
当你read从O_DIRECTFD中,“用户的定位缓冲区和文件偏移都必须是文件系统的逻辑块大小的倍数”(引自open手册页在Linux上)。其他环境对此可能有不同的约束,并且实际上是依赖于文件系统的。
read
O_DIRECT
open
new通常情况并非如此(除非您很幸运)。
new
posix_memalign如果平台具有该功能,则应考虑使用该功能,或者只是分配一个更大的缓冲区(BLOCK_SIZE + BUFSIZE),然后使用该功能的块大小对齐部分。
posix_memalign
如果您要坚持使用new,则需要结合上面的内容使用某种形式的new布局,但是我对此并不十分熟悉,无法展示其工作原理。
作为参考,例如,请参见LKML上的该线程,或上面引用的手册页的“注释”部分。