Как я могу прочитать файл с read() и O_DIRECT в C++ в Linux?

Я ищу решение, чтобы решить вышеописанную проблему.

Вот мой "не работает код". charsInCurrentBuffer всегда возвращает -1!

#define BUFSIZE 512

char *bufferA = new char[BUFSIZE];
char *bufferB = new char[BUFSIZE];

const char *inputFile = "in.txt";

if ( (fdInputFile = open(inputFile, O_DIRECT) ) != -1) {
    cout << "input opened!" << endl;
} else {
    cout << "can't open input file!";
}

int charsInCurrentBuffer = read(fdInputFile, currBuffer, BUFSIZE);
cout << charsInCurrentBuffer << endl;

1 ответ

Решение

Когда ты read из O_DIRECT fd, "выравнивание пользовательского буфера и смещение файла должны быть кратны размеру логического блока файловой системы" (цитируется из open man страница) в Linux. Другие среды могут иметь другие ограничения на это, и на самом деле это зависит от файловой системы.

Это не будет иметь место с new как правило (если вам не повезет).

Вы должны рассмотреть возможность использования posix_memalign Функция, если ваша платформа имеет это, или просто выделите больший буфер (BLOCK_SIZE + BUFSIZE) и используйте его часть, выровненную по размеру блока.

Если вы хотите придерживаться newвам нужно будет использовать новую форму размещения в сочетании с вышеописанным, но я недостаточно знаком с этим, чтобы показать, как это будет работать.

Для справки см., Например, эту ветку на LKML или раздел "Примечания" вышеприведенной справочной страницы.

Другие вопросы по тегам