#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)