mmap: map_anonymous почему это дает SIGSEGV? - PullRequest
1 голос
/ 23 декабря 2011

Почему этот сегмент кода дает ошибку сегментации?

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <string.h>

int main()
{
    void *ptr;

    ptr=mmap(NULL, 10, PROT_READ|PROT_WRITE, MAP_ANONYMOUS, -1, 0);
    strcpy(ptr, "Hello");

}

Или лучше, я бы хотел: char *ptr=malloc(10); затем передать этот аргумент в mmap.Оба дает SIGSEGV.

Ответы [ 2 ]

10 голосов
/ 23 декабря 2011

Проверьте возвращаемые значения ваших системных вызовов!

Аргумент flags для mmap должен иметь ровно одну из следующих двух опций:

MAP_SHARED
  Share  this mapping.  Updates to the mapping are visible to other processes
  that map this file, and are carried through to the underlying file. The file
  may not actually  be updated until msync(2) or munmap() is called.

MAP_PRIVATE
  Create  a private copy-on-write mapping.  Updates to the mapping are not
  visible to other processes mapping the same file, and are not carried through
  to the underlying file.   It is  unspecified whether changes made to the file
  after the mmap() call are visible in the mapped region.

Вы этого не предоставляете, поэтому, скорее всего, mmap завершится неудачно (вернув (void*)-1), если errno установлено на EINVAL.

0 голосов
/ 24 декабря 2011

Вы, вероятно, получите MAP_FAILED (то есть (void*)-1) в результате вашего mmap с EINVAL в errno.Справочная страница из mmap(2) говорит, что она не работает с

   EINVAL We don't like addr, length, or offset (e.g., they are too large,
          or not aligned on a page boundary).

Ваш второй аргумент mmap (на справочной странице length) не может быть 10. Он долженбыть кратным длине страницы (не менее 4K).

...