2016-02-13 3 views
-1

J'essaie d'écrire un programme qui lit un fichier en utilisant 'mmap' pour l'école. J'ai de la difficulté à créer la carte. Plus précisément, je reçois une erreur de segmentation. Je ne suis pas vraiment sûr de ce que je fais mal ici, donc une aide concrète serait appréciée. Je vous remercie.C 'mmap' provoquant une erreur de segmentation. Des idées?

#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 peut avoir la bonne réponse, mais de poster une question avant les étapes de débogage même triviales comme la vérification 'fopen()' est pas nul me semble juste paresseux. – John3136

Répondre

3

Vous ne spécifiez pas quoi que ce soit comme argument de drapeau, vous devez soit spécifier MAP_PRIVATE ou MAP_SHARED comme indiqué here:

L'argument flags détermine si des mises à jour de la cartographie sont visibles à d'autres processus de cartographie la même région et si les mises à jour sont effectuées dans le fichier sous-jacent. Ce comportement est déterminé en incluant exactement l'une des valeurs suivantes dans les indicateurs:

MAP_SHARED Partagez cette correspondance. Les mises à jour du mappage sont visibles par les autres processus qui mappent ce fichier et sont transmis au fichier sous-jacent. (Pour contrôler avec précision lorsque des mises à jour sont menée à son fichier sous-jacent nécessite l'utilisation de msync (2).)

MAP_PRIVATE Créer une cartographie copie sur écriture privée. Les mises à jour du mappage ne sont pas visibles par les autres processus mappant le même fichier et ne sont pas transmises au fichier sous-jacent. Il est non spécifié si les modifications apportées au fichier après l'appel mmap() sont visibles dans la région mappée.

Dans votre cas, puisque vous êtes en train de lire le fichier, MAP_PRIVATE devrait suffire.

Essayez avec:

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

Excellent cela a fonctionné pour moi. Je n'ai pas compris à quoi servaient les drapeaux. Je vous remercie. –