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

Я ищу решение для решения описанной выше проблемы.

Вот мой "неработающий код".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 Ответ

7 голосов
/ 14 мая 2011

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...