Segfault для перекрытия memcpy во время mmap - PullRequest
0 голосов
/ 08 сентября 2011

У меня проблема с mmap, которую я не могу решить. Вот настройка: я выделяю огромный многомерный массив в память с помощью malloc, заполняю его своими значениями и затем хочу сохранить его в файл. Массив содержит 3200000000 байт. Машина является 64-битной и имеет достаточно памяти для этого.

Linux 2.6.32-27-server #49-Ubuntu SMP Thu Dec 2 02:05:21 UTC 2010 x86_64 GNU/Linux

Создание файла с помощью mmap работает просто отлично, я получаю указатель ptrFile. Когда я записываю свой массив в этот указатель ptrFile, программа завершается с ошибкой.

После нескольких отладок я вижу, что два буфера перекрываются. Массив данных начинается с адреса 0x7FEC47FFF010, а указатель, возвращаемый mmap, равен 0x7FEA2543E000. Я пытался решить эту проблему, но результат тот же. Если я ограничу размер копируемого файла до 1000 байт, он будет работать нормально.

Почему два выделенных указателя перекрываются?

Большое спасибо!

- J

Ответы [ 3 ]

2 голосов
/ 08 сентября 2011

mmap () не может расширить файл.Перед копированием данных сначала необходимо увеличить файл до нужного размера, используя, например, ftruncate.Хотя использование mmap для простого копирования данных в файл излишне, достаточно просто использовать write (2).

2 голосов
/ 08 сентября 2011

Эти области памяти не перекрываются (пока ваш mmap блок соответствует размеру, который вы говорите). 0x7FEC47FFF010 - 0x7FEA2543E000 = 9,172,684,816, что намного больше, чем размер 3,200,000,000, который вы упомянули.

1 голос
/ 08 сентября 2011

Вам действительно нужно mmap?Если единственное, что вы хотите сделать, - это сохранить блок памяти, то для этого достаточно простого write или fwrite области malloc.Вы только должны быть уверены, что они обрабатывают 64-битные размеры.

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