2016-02-13 3 views
-1

Я пытаюсь написать программу, которая читает файл, используя «mmap» для школы. Мне сложно создать карту. В частности, я получаю ошибку сегментации. Я не совсем уверен, что я делаю неправильно здесь, поэтому какая-то конкретная помощь будет оценена по достоинству. Спасибо.C 'mmap' вызывает ошибку сегментации. Идеи?

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

int main(int argc, char* argv[]) 
{ 
    printf("Hello world!\n"); 

    FILE* fp;// File pointer 
    int fd;// File descriptor 
    size_t size;// Length of the file 
    char* map;// File mmap 

    /* Open the file */ 
    fp = fopen("data.txt", "r+"); 

    /* Get the file descriptor */ 
    fd = fileno(fp); 
    printf("FD: %d\n", fd); 

    /* Get the size of the file */ 
    fseek(fp, 0, SEEK_END); 
    size = ftell(fp); 
    fseek(fp, 0, SEEK_SET); 
    printf("SIZE: %d\n", size); 

    /* Map the file with mmap */ 
    map = mmap(NULL, size, PROT_READ, 0, fd, 0); 

    if (map == MAP_FAILED) 
    { 
     printf("MMAP FAILED\n"); 
    } else { 
     printf("MMAP SUCEEDED\n"); 
    } 

    /* Do something with the map */ 
    int i; 
    for (i = 0; i < size; i++) 
    { 
     char c; 
     c = map[i]; 
     putchar(c); 
    } 

    fclose(fp); 

    return(0); 
} 
+0

@Jack может иметь правильный ответ, но опубликовав вопрос еще до тривиальных шагов отладки как проверка 'FOPEN()' не пустой кажется мне просто лень. – John3136

ответ

3

Вы ничего не уточняя в качестве аргумента флага, необходимо указать либо MAP_PRIVATE или MAP_SHARED как указано here:

флаги аргумент определяет обновление отображения, является ли видимых для других процессов отображения в том же регионе, и будут ли обновления перенесены в основной файл. Это поведение определяется включением только одного из следующих значений в флаги:

MAP_SHARED Поделитесь этим сопоставлением. Обновления сопоставления видны другим процессам, которые отображают этот файл и переносятся в базовый файл. (Для того, чтобы точно контролировать, когда обновление доведенного до базового файла требует использования msync (2).)

MAP_PRIVATE Создать индивидуальное отображение копирования при записи. Обновления сопоставления не отображаются другим процессам, сопоставляющим один и тот же файл и не переносятся в основной файл. Он не указан, отображаются ли изменения в файле после вызова mmap() в отображаемой области.

В вашем случае, поскольку вы просто читаете файл, должно быть достаточно MAP_PRIVATE.

Try с:

map = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0); 
+0

Отлично, это сработало для меня. Я не понимал, для чего использовались флаги. Спасибо. –

Смежные вопросы