ограничение размера карты mmap

Возможный дубликат:
Получение ошибки сегментации SIGSEGV в memcpy после mmap

Я использую mmap () в своем коде cpp для отображения области большого размера (100 000 000 байт ~ 100 МБ).

От man mmap я понимаю, что могу только знать, удалось ли это или нет, я не могу знать, какой размер удалось отобразить.

В моем случае я мог бы прочитать эту область итеративно с буфером в 8192 байта, но после того, как я прочитал ~ 24 МБ, я получил SIGSEGV — означает, что mmap не отображал все площадь успешно?

Я читаю функцию memcpy для копирования из сопоставленной области в мой буфер в куче. (Я вижу такое же поведение, когда буфер находится в стеке).

Как я могу узнать, нанесено ли оно на всю область или нет? И если он отобразил всю область, то почему я получаю SIGSEGV после прочтения около 24 МБ байтов?

Спасибо!

0

Решение

int *  addr = reinterpret_cast<int *>(mmap(NULL, length , PROT_READ, flags , fd, 0));
// ...
int * initaddr = addr;

char buffer[jbuffer_size];

void *ret_val = buffer;
int read_length = length;

while(ret_val == buffer || read_length<jbuffer_size) {
ret_val = memcpy(buffer, addr,jbuffer_size);
addr+=jbuffer_size;
read_length -= jbuffer_size;
}

Итак, ваше условие завершения выглядит неправильно: вы декремент read_length и цикл, пока это не меньше, чем buffer_size,

Кроме того, вы увеличиваете addr от buffer_size целые (это int*), не байт. Итак, вы продвигаетесь addr В 4 раза быстрее

Кстати, в другом коде: lseek берет и возвращает off_tне size_t,


Изменить: большинство из этих ошибок уже указано в другом вопросе, поэтому я не уверен, что этот добавляет что-то.

6

Другие решения

Если вы получаете нарушение сегментации, это не потому, что mmap не удалось, это из-за чего-то другого. Вы пытаетесь получить доступ к сегменту за пределами любого региона, отображенного в виртуальную память вашего процесса.

Проверьте доступ к памяти вашей программы по набору карт, выделенных вашей программой. Рассмотреть возможность использования pmap, strace а также gdb,

2

По вопросам рекламы [email protected]