Salut,
Citation
AdrMem = (char *)mmap(NULL, StructFichier.st_size, PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, Desc, 0);
Je ne comprennais pas l'écriture PROT_READ | PROT_WRITE et MAP_FILE | MAP_SHARED.
Ne connaissant pas les valeurs de ces constantes, j'ai utilisé printf pour les connaitres. ( elles sont définies dans /usr/include/asm/mman.h, comme je l'ai dit plus haut).
Pour moi il était évident que si l'on donnait le parametre PROT_WRITE, on avait forcement le droit de lecture. Donc pour moi PROT_READ | PROT_WRITE était une erreur.
Mais le fichier mman.h m'a permis de comprendre, que l'on peut combiner les differentes valeurs de PROT, pour donner les droits que l'on souhaite à la zone mémoire allouée par mmap. Donc utilisation du | (OU inclusif).
mmap "regarde" les bits qui sont à un pour le parametre PROT.
Citation
PROT_READ mmap recoit 001 r-- (binaire)
PROT_WRITE mmap recoit 010 -w-
PROT_EXEC mmap recoit 100 --x
PROT_READ | PROT_WRITE mmap recoit 011 rw-
PROT_READ | PROT_WRITE | PROT_EXEC mmap recoit 111 rwx
Si on avait eu un PROT_WRITE | PROT_EXEC je ne me serais pas posé cette question.
Puis le MAP_FILE | MAP_SHARED à finit de m'enfoncer.
MAP_FILE vaut 0 ! Pourquoi faire une operation dessus ?
Alors là c'est pas trés clair, j'ai fait quelques recherches et il semblerait que MAP_FILE soit conservée pour des raisons de compatibilités avec d'anciennes applications, mais l'écriture MAP_FILE | MAP_* semble obsolete.
A confirmer tout de meme.
Citation
jacques35
la ligne : printf ("%d %d\n", PROT_READ, MAP_SHARED);
genère 1 | 1.
Que dois je comprendre ?
Cette ligne provoque l'affichage : 1 1
Et permet juste de connaitre les valeurs de ces deux constantes.
Remarque : Dans ton dernier code, on a juste un acces en lecture dans la zone mémoire.
Je connais pas tes besoins, mais la correction du premier code que tu as donné serait :
Citation
Desc = open(argv[1], O_RDWR);
mmap (NULL, Taille, PROT_READ | PROT_WRITE, MAP_SHARED, Desc, 0);
A Ciao