在Ubuntu上,使用O_DIRECT标志调用open()函数无法正常工作

5

我想使用O_DIRECT标志打开一个文件。在Ubuntu上,程序错误代码为22。我在同一台机器上双启动安装了Fedora,这段完全相同的代码可以平稳运行。

我正在运行Ubuntu 13.10,内核版本为3.12.6,g++版本为4.8.1,文件系统为ext4。我刚刚安装的Fedora版本是20,内核版本为3.12.6。

#include <unistd.h>
#include <fcntl.h>
#include <iostream>
#include <errno.h>

using namespace std;

int main(void)
{
    int filedesc = open("testfile.txt", O_RDWR | O_CREAT | O_APPEND | O_DIRECT);
    if (filedesc < 0) {
    std::cout << "fail with errno: " << errno << std::endl;
        return -1;
    }
    return 0;
}
1个回答

4

您可能已经启用了数据日志记录 ext4 功能。由于数据已被记录,因此写入必须进行缓冲(请思考一下),因此 O_DIRECT 将会失败并返回 EINVAL


谢谢!我正在研究它。等我调查完毕后会回报。 - nday
非常感谢你,David!你是对的。我创建了一个新的ext4分区,关闭了它的日志记录,并将代码复制到那里。现在它可以运行了。 :) - nday
我也有同样的问题,但我的文件系统是挂载为data=ordered(默认值)。根据ext4文档,O_DIRECT应该可以工作。有人可以证实我的发现吗? - user1202136
Umm,O_DIRECT的意思是内核使用DMA将您的I/O请求结果直接放入用户空间缓冲区。而且必须对齐以使DMA正常工作(在Linux上为512字节,最好使用posix_memalign,请参见https://dev59.com/Mmw15IYBdhLWcg3whME1,还可以查看man 2 open - http://man7.org/linux/man-pages/man2/open.2.html) - PAStheLoD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接