C++ open()在UBUNTU上不使用O_DIRECT标志

C++ open()在UBUNTU上不使用O_DIRECT标志,c++,linux,ubuntu,file-io,disk,C++,Linux,Ubuntu,File Io,Disk,我正试图打开一个带有O_DIRECT标志的文件。在Ubuntu上,程序失败,错误号为22。我刚刚在同一台机器上安装了Fedora,它具有双引导功能,并且完全相同的代码在那里顺利运行 我正在运行Ubuntu13.10,内核为3.12.6,g++版本为4.8.1,文件系统为ext4。我刚刚安装的Fedora是内核为3.12.6的版本20 #include <unistd.h> #include <fcntl.h> #include <iostream> #incl

我正试图打开一个带有O_DIRECT标志的文件。在Ubuntu上,程序失败,错误号为22。我刚刚在同一台机器上安装了Fedora,它具有双引导功能,并且完全相同的代码在那里顺利运行

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

#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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
内部主(空)
{
int filedesc=open(“testfile.txt”,O|RDWR | O|u create | O|u APPEND | O|u DIRECT);
if(filedesc<0){

std::cout您可能启用了数据日志记录ext4功能。记录数据时,必须缓冲写操作(仔细想想),因此,
O_DIRECT
将因
EINVAL
而失败。谢谢!我正在调查。我会回来报告。非常感谢你,大卫!你是对的。我用ext4创建了一个新分区,关闭了它的日志记录,并将代码复制到那里。它现在运行。:)我有同样的问题,但我的文件系统已装入
data=ordered
(默认)。根据ext4文档,O_DIRECT应该可以工作。有人能证实我的发现吗?嗯,O_DIRECT意味着内核使用DMA将I/O请求的结果直接放入用户空间缓冲区。而且必须对齐它才能让DMA工作。(linux上512字节,最好使用posix_memalign,请参阅,另请参阅man 2 open-)