mremap возвращает размер, но должен возвращать действительный указатель

#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 исправил бы его по умолчанию.