Как я могу прочитать файл с 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 или раздел "Примечания" вышеприведенной справочной страницы.