【问题标题】:open() not working with O_DIRECT flag on UBUNTUopen() 不适用于 UBUNTU 上的 O_DIRECT 标志
【发布时间】:2014-01-24 16:53:24
【问题描述】:

我正在尝试打开带有 O_DIRECT 标志的文件。在 Ubuntu 上,程序失败并显示 errno 22。我刚刚在同一台机器上安装了 Fedora 并进行了双启动,并且完全相同的代码在那里运行顺利。

我正在运行带有内核 3.12.6 和 g++ 版本 4.8.1 和文件系统 ext4 的 Ubuntu 13.10。我刚安装的 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;
}

【问题讨论】:

    标签: c++ linux ubuntu file-io disk


    【解决方案1】:

    您可能启用了数据日志 ext4 功能。随着数据被记录,写入必须被缓冲(考虑一下),所以O_DIRECT 将失败并显示EINVAL。

    【讨论】:

    • 谢谢!我正在调查它。会回来报告的。
    • 非常感谢,大卫!你是对的。我用 ext4 创建了一个新分区,关闭了它的日志功能,并将代码复制到那里。它现在运行。 :)
    • 我也有同样的问题,但是我的文件系统挂载了data=ordered(默认)。根据 ext4 文档, O_DIRECT 应该可以工作。谁能证实我的发现?
    • 嗯,O_DIRECT 意味着内核使用 DMA 将 I/O 请求的结果直接放入用户空间缓冲区。并且必须对齐 DMA 才能工作。 (Linux 上 512 字节,最好使用 posix_memalign,参见 stackoverflow.com/questions/6563120/…,另请参见 man 2 open - man7.org/linux/man-pages/man2/open.2.html)
    猜你喜欢
    • 2011-06-30
    • 2019-05-09
    • 2021-11-30
    • 1970-01-01
    • 2010-10-29
    • 2022-11-10
    • 2021-11-28
    • 2016-10-21
    • 1970-01-01
    相关资源
    最近更新 更多