2011-12-12 6 views
1

je reçois une erreur de segmentation quand je lance le morceau de code suivant ...Pourquoi mmap ne fonctionne pas ici

int * x = mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_PRIVATE, 0, 0); 

x[0] = 42; // <--- Segmentation fault happens due to this 

Qu'est-ce qui ne va pas ici?

+1

Avez-vous vérifié si l'appel à mmap a réussi? – Tudor

+1

Le descripteur de fichier 0 (l'argument last-but-one) est un périphérique de caractères. Peut-être que vous voulez -1? – wildplasser

Répondre

1

OK, j'ai compris. J'ai oublié de placer MAP_ANONYMOUS, il devrait donc avais été comme ça ...

int * x = mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, 
    0, 0); 

Son travail de cette façon.

+2

Spécifiez fd comme -1. En linux fd est ignoré lorsque MAP_ANONYMOUS est spécifié. mais une implémentation unix l'exige. Les applications portables devraient passer fd à -1. – JagsVG

1

man mmap dit:

On success, mmap() returns a pointer to the mapped area. On error, the value MAP_FAILED (that is, (void *) -1) is returned, and errno is set appropriately

Vérifiez, que ce soit x == MAP_FAILED ou non. Peut être que c'est le cas.

9

Vous avez spécifié les indicateurs et le descripteur de fichier incorrects. Il semble que ce que vous voulez soit un mappage anonyme (non soutenu par un fichier). Si tel est le cas, l'appel serait correct:

x = mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); 

Vous devez utiliser le drapeau MAP_ANONYMOUS pour dire Linux il n'y a pas de fichier. Et vous devez passer -1 pour le descripteur de fichier, pas 0.

+0

Oui vous avez raison, comme je l'ai déjà mentionné dans ma réponse :-p! – MetallicPriest

0

Et vous devez toujours vérifier que le résultat de mmap n'est pas MAP_FAILED (c'est (void *) -1) et utiliser errno pour obtenir le code d'erreur dans ce cas.

Votre mmap peut échouer (par exemple en raison des limites de ressources définies avec setrlimit ou parce que l'espace d'échange est plein).

Questions connexes