Мне нужна помощь в вводе файла по частям в mmap

#c #mmap

#c #mmap

Вопрос:

Я пытаюсь использовать mmap для чтения файла, используя фрагменты по 1024.

Вот фрагмент кода….

 numberOfBuffers = filesize / buffersize;
if (filesize % buffersize) 
{
  numberOfBuffers  ;       
}

for (i = 0; i < numberOfBuffers; i  ) {
    if((map = mmap(NULL, buffersize, PROT_READ, MAP_PRIVATE, fd, i * buffersize)) == MAP_FAILED) {
        perror("map failed");
    }

    if(munmap(map, buffersize) == -1) {
            perror("unmap failed");
    }
 }
  

Я получаю ошибку «недопустимый аргумент» на второй итерации.

Я хочу разобраться в mmap и получить помощь в том, как выполнить итерацию по mmap с определенным размером буфера.

Комментарии:

1. «…похоже на…» — не угадывайте, убедитесь, пожалуйста.

2. Я думаю, что это if (numberOfBuffers % buffersize) должно быть if (fileSize % buffersize)

3. Извините… У меня была инструкция print после первой инструкции if, и она печаталась только один раз, после чего я получил ошибку «недопустимый аргумент».

Ответ №1:

Со mmap справочной страницы:

смещение должно быть кратно размеру страницы, возвращаемому sysconf(_SC_PAGE_SIZE).

Размер страницы во многих системах if (особенно x86) составляет 4k (4096 байт). Таким образом, первый вызов будет успешным (со смещением 0), но второй вызов завершится неудачей (смещение 1024 недопустимо).

Попробуйте изменить размер вашего фрагмента на 4096 (или любой другой размер страницы на вашей платформе, а лучше используйте sysconf для получения этой информации).

Комментарии:

1. Вот и все, как только я использовал 4096 или кратные ему значения, он заработал. Спасибо за помощь. Теперь я понимаю это немного лучше.