首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Linux上的C++中使用read()和O_DIRECT读取文件?

如何在Linux上的C++中使用read()和O_DIRECT读取文件?
EN

Stack Overflow用户
提问于 2011-05-14 18:40:02
回答 1查看 7.1K关注 0票数 2

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

这是我的“无法工作的代码”。charsInCurrentBuffer总是返回-1!

代码语言:javascript
复制
#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;
EN

Stack Overflow用户

回答已采纳

发布于 2011-05-14 18:48:08

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

通常情况下,new并非如此(除非您走运)。

您应该考虑使用posix_memalign函数(如果您的平台具有该函数),或者简单地分配一个更大的缓冲区(BLOCK_SIZE + BUFSIZE)并使用其中与块大小对齐的部分。

如果你想坚持使用new,你将需要使用某种新的布局形式,结合上面的内容,但我对此还不够熟悉,无法说明它是如何工作的。

有关参考信息,请参见此thread on LKML或上面引用的手册页的备注部分。

票数 8
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6001272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档