如何在Linux上用C ++读取带有read()和O_DIRECT的文件?

时间:2011-05-14 10:40:02

标签: c++ linux file

我正在寻找解决上述问题的解决方案。

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

1 个答案:

答案 0 :(得分:7)

当您从read fd O_DIRECT时,“用户缓冲区的对齐方式和文件偏移量必须都是文件系统逻辑块大小的倍数”(引自{{ 3)})在Linux上。其他环境可能对此有不同的限制,实际上它依赖于文件系统。

new一般不会出现这种情况(除非你很幸运)。

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

如果你想坚持使用new,你将需要使用某种形式的贴装新结合上述内容,但我对此并不熟悉,以显示它是如何起作用的。< / p>

作为参考,请参阅例如此open man page或上述手册页的“注释”部分。