Почему ММАП не работает здесь - PullRequest
1 голос
/ 12 декабря 2011

Я получаю ошибку сегментации, когда запускаю следующий фрагмент кода ...

int * x = mmap( 0, 4096, PROT_READ | PROT_WRITE, MAP_PRIVATE, 0, 0 );

x[0] = 42; // <--- Segmentation fault happens due to this

Что здесь не так?

Ответы [ 4 ]

9 голосов
/ 12 декабря 2011

Вы указали неправильные флаги и дескриптор файла.Похоже, что вам нужно анонимное (не подкрепленное файлом) отображение.В этом случае правильный вызов будет:

x = mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);

Вам нужно использовать флаг MAP_ANONYMOUS, чтобы сообщить Linux, что файла нет.И вы должны передать -1 для дескриптора файла, а не 0.

1 голос
/ 12 декабря 2011

man mmap говорит:

On success, mmap() returns a pointer to the mapped area. On error, the value MAP_FAILED (that is, (void *) -1) is returned, and errno is set appropriately

Проверьте, x == MAP_FAILED или нет. Может быть, это так.

1 голос
/ 12 декабря 2011

ОК, я понял. Я забыл разместить MAP_ANONYMOUS , поэтому должно было быть так ...

int * x = mmap( 0, 4096, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, 
  0, 0 );

Так работает.

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

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

Ваш mmap может произойти сбой (например, из-за ограничений ресурса, установленных с помощью setrlimit , или из-за того, что пространство подкачки заполнено).

...