Возможный дубликат:
Получение ошибки сегментации SIGSEGV в memcpy после mmap
Я использую mmap () в своем коде cpp для отображения области большого размера (100 000 000 байт ~ 100 МБ).
От man mmap я понимаю, что могу только знать, удалось ли это или нет, я не могу знать, какой размер удалось отобразить.
В моем случае я мог бы прочитать эту область итеративно с буфером в 8192 байта, но после того, как я прочитал ~ 24 МБ, я получил SIGSEGV — означает, что mmap не отображал все площадь успешно?
Я читаю функцию memcpy для копирования из сопоставленной области в мой буфер в куче. (Я вижу такое же поведение, когда буфер находится в стеке).
Как я могу узнать, нанесено ли оно на всю область или нет? И если он отобразил всю область, то почему я получаю SIGSEGV после прочтения около 24 МБ байтов?
Спасибо!
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
,
Изменить: большинство из этих ошибок уже указано в другом вопросе, поэтому я не уверен, что этот добавляет что-то.
Если вы получаете нарушение сегментации, это не потому, что mmap
не удалось, это из-за чего-то другого. Вы пытаетесь получить доступ к сегменту за пределами любого региона, отображенного в виртуальную память вашего процесса.
Проверьте доступ к памяти вашей программы по набору карт, выделенных вашей программой. Рассмотреть возможность использования pmap
, strace
а также gdb
,