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