mmap () вызывает ошибку сегментации в C - PullRequest
0 голосов
/ 18 марта 2020

Я почти уверен, что моя ошибка очень очевидна, но я просто не могу понять, где проблема.

Я учусь, как использовать mmap() в C, все выглядит правильно для меня, но я получаю ошибку сегментации.

Вот мой код:

int n=50;
char * tab = mmap(NULL, n, PROT_READ | PROT_WRITE, MAP_SHARED, -1, 0);

for(int i=0; i<n; i++)
{
   tab[i] = 1;
}

Используя valgrind, я получаю сообщение об ошибке «Неверная запись размера 1» в строка, где я делаю tab[i]=1 (я пытался заменить 1 на '1', думая, что, возможно, символ имеет меньший размер, чем int, но все равно получаю ту же ошибку), за которым следует "Адрес * 1014" * is not stack'd, mallo c 'd или (недавно) free'd ".

Я понятия не имею, где моя ошибка. Может ли кто-нибудь помочь мне найти его?

1 Ответ

3 голосов
/ 18 марта 2020

С man 2 mmap:

Содержимое сопоставления файлов (в отличие от анонимного сопоставления; см. MAP_ANONYMOUS ниже) инициализируется с помощью length байты, начинающиеся со смещения offset в файле (или другом объекте), на который ссылается дескриптор файла fd.

Я предполагаю, что вы пытаетесь создать анонимное отображение (т.е. не поддерживается файл). В этом случае вам потребуется для добавления MAP_ANONYMOUS к flags, в противном случае система попытается выполнить чтение из указанного fd, что недопустимо (-1) и завершится неудачей.

Правильный код:

char *tab = mmap(NULL, n, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
if (tab == MAP_FAILED) {
    perror("mmap");
    exit(1);
}

В будущем обратите внимание, что вы можете легко обнаружить ошибку, как я делал выше, с помощью простого вызова perror() в случае, если возвращаемое значение указывает на ошибку. В вашем случае он должен был напечатать следующее:

mmap: Bad file descriptor

Снова проверяя руководство, вы можете увидеть в разделе «ОШИБКИ»:

EBADF : fd не является допустимым дескриптором файла (и MAP_ANONYMOUS не был установлен).

...