我正在寻找解决上述问题的方法。
这是我的“无法工作的代码”。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;发布于 2011-05-14 18:48:08
当您从Linux执行read时,在O_DIRECT上“用户缓冲区和文件偏移量的对齐必须都是文件系统逻辑块大小的倍数”(引用自open man page)。其他环境可能对此有不同的限制,实际上它依赖于文件系统。
通常情况下,new并非如此(除非您走运)。
您应该考虑使用posix_memalign函数(如果您的平台具有该函数),或者简单地分配一个更大的缓冲区(BLOCK_SIZE + BUFSIZE)并使用其中与块大小对齐的部分。
如果你想坚持使用new,你将需要使用某种新的布局形式,结合上面的内容,但我对此还不够熟悉,无法说明它是如何工作的。
有关参考信息,请参见此thread on LKML或上面引用的手册页的备注部分。
https://stackoverflow.com/questions/6001272
复制相似问题