2017-10-11 10 views
0
int main() { 
    int fd;  // File Descriptor for the integer file 
    int pagesize=getpagesize(); // To store the size of virtual page 

    printf("\nPage size is %d bytes.\n100 integers require %lu bytes\n",pagesize,100*sizeof(int)); 
    void *data; // This is the pointer which will store the returned pointer when mmap() is called 

    fd=open("integer", O_RDWR); 

    data=mmap((caddr_t)0, pagesize, PROT_WRITE | PROT_READ, MAP_SHARED, fd,0); 
    close(fd); 

    sprintf((char*)data,"%d",100); 

    return 0; 
} 

Cela renvoie une erreur Segmentation 11Pourquoi ai-je cette erreur de segmentation?

+7

Vous pouvez vérifier si mmap() a échoué. Si c'est le cas, appelez 'perror()' ou inspectez 'errno' pour savoir pourquoi il a échoué. Vous devez également vérifier si open() a échoué. – nos

+0

Votre fichier "nombre entier" n'existe probablement pas; vous devrez le créer d'abord avec une longueur appropriée, un fichier de longueur nulle ne le fera pas ... Si vous l'ouvrez avec 'O_CREAT', écrivez-lui (assez pour vos données) des octets avant mmapping (seek() ing fera aussi). – Ctx

Répondre

2

Vous devriez vérifier les erreurs de open et mmap. Compilez également avec des avertissements et incluez les fichiers d'inclusion nécessaires. mmap a particulièrement besoin d'un prototype correct sur de nombreux systèmes en raison de ses arguments off_t qui pourraient casser des choses quand vous lui passez un 0 comme dernier argument.

Mais ce n'est pas suffisant. Le fichier existe-t-il et est de taille non nulle? mmap peut heureusement mapper des pages au-delà de la fin d'un fichier, mais l'accès à ces pages entraînera des erreurs. Si vous voulez réellement que les données soient écrites dans le fichier, vous devez vous assurer qu'il est assez long pour cela. Utilisez ftruncate pour cela.

Aussi, je me demande dans quel musée vous avez trouvé votre documentation si elle mentionne caddr_t comme premier argument à mmap, mais c'est à côté du point, si cela compile cela devrait aussi fonctionner.