Я пытаюсь открыть файл с флагом 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;
}
Возможно, у вас включена функция журналирования данных ext4. С данными, ведущимися в журнале, пишет должен быть в буфере (подумайте об этом), так O_DIRECT
потерпит неудачу с EINVAL
,
Других решений пока нет …