Проблема Mmap -> ошибка сегмента

#c #segmentation-fault #mmap

#c #ошибка сегментации #mmap

Вопрос:

Я хотел бы поделиться, как использовать mmap. Однако это не работает, потому что я получаю ошибку сегмента :

 int fdL = open("/dev/zero", O_RDWR | O_CREAT);
int *ligneC = (int *) mmap(0, sizeof (int), PROT_READ | PROT_WRITE, MAP_SHARED, fdL, 0);

*ligneC = 0;
  

Где я не прав?

Комментарии:

1. Вы указываете O_CREAT и пропускаете режим; тем не менее, это не может быть проблемой, поскольку я предполагаю, что /dev/zero она уже существует. Это весь ваш код?

2. Ошибка исходит от: *ligneC = 0; Я не знаю, почему

3. Позвольте мне «перефразировать» это: это весь ваш код ?

4. Нет, это для студенческого проекта (матричное вычисление с несколькими процессами), но для этого шага я должен использовать mmap. Есть ли другой способ разделить переменную между всеми моими процессами?

5. Я имею в виду, что он не должен завершаться сбоем, и, вероятно, что-то еще сломано.

Ответ №1:

У меня ваш код работает нормально. Попробуйте добавить несколько проверок на ошибки в свой код. Вы будете знать, что происходит сбой и почему:

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

int main(int argc,char*argv[])
{
    int fdL = open("/dev/zero", O_RDWR | O_CREAT);

    if(fdL<0)
    {
        perror("open");
        exit(1);
    }

    int *ligneC = (int *) mmap(0, sizeof (int), PROT_READ | PROT_WRITE, MAP_SHARED, fdL, 0);

    if(ligneC==(int*)-1)
    {
        perror("mmap");
        exit(1);
    }

    *ligneC = 0;
    return 0;
}
  

Комментарии:

1. Спасибо! Я получаю: mmap: Операция, не поддерживаемая устройством (я использую Mac)