#linux #memory #memory-management #shared-memory #mmap
#linux #память #управление памятью #разделяемая память #mmap
Вопрос:
Согласно документации mremap (https://www.man7.org/linux/man-pages//man2/mremap.2.html ), «При успешном выполнении mremap() возвращает указатель на новую область виртуальной памяти. При ошибке возвращается значение MAP_FAILED (то есть (void *) -1), и значение errno устанавливается соответствующим образом.»
Ниже приведен мой код для mremap. При вводе значения устанавливаются следующим образом:
old_address: (void *) 0x7ffff4957000 (140737296822272)
old_size: 8003584
new_size: 16007168
После вызова возвращаемый параметр указателя равен (void *) 0x7a2000, что является значением old_size (8003584), а не допустимым значением указателя.
Вот код:
void * remap_shm(void *old_address, size_t old_size, size_t new_size)
{
void * return_ptr;
return_ptr = mremap(old_address, old_size, new_size, MAP_PRIVATE | MREMAP_MAYMOVE);
if (return_ptr <= 0){
printf("Error on remap! %sn", strerror(errno)); }
return return_ptr;
}
Если я опущу флаг MREMAP_MAYMOVE, произойдет сбой.
Я очень озадачен. Кто-нибудь может объяснить, почему я получаю значение old_size, возвращаемое в качестве указателя на новое отображение памяти?
Спасибо.
Комментарии:
1. Ответ Пилкроу объяснил значение возвращаемого значения, однако я бы предпочел, чтобы возвращаемое значение оставалось действительным указателем (но части вашей программы могут отсутствовать).
Ответ №1:
Опустите MAP_PRIVATE.
MAP_PRIVATE не является допустимым флагом для mremap
. В моей системе MAP_PRIVATE == MREMAP_FIXED, что означает, что mremap
ошибочно ожидается пятый аргумент, который вы не предоставляете.
Комментарии:
1. Да, вы правы. Теперь я получаю значение указателя. Я удивлен, что MAP_PRIVATE исправил бы его по умолчанию.