+-

我正在寻找解决上述问题的解决方案.
这是我的“不工作代码”. 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读取时,Linux上的“用户缓冲区和文件偏移的对齐必须都是文件系统的逻辑块大小的倍数”(引自
open man page).其他环境可能对此有不同的约束,实际上它依赖于文件系统.
一般情况下不会出现这种情况(除非你很幸运).
如果你的平台有这个功能,你应该考虑使用posix_memalign函数,或者只是分配一个更大的缓冲区(BLOCK_SIZE BUFSIZE)并使用它的块大小对齐部分.
如果你想坚持使用新的,你将需要使用某种形式的新的结合上面的,但我不熟悉它,以显示它将如何工作.
有关参考,请参阅例如此thread on LKML或上述手册页的“注释”部分.
点击查看更多相关文章
转载注明原文:如何在Linux上用C读取带有read()和O_DIRECT的文件? - 乐贴网