mprotect | Début | Suivant | Sommaire | Préc.page.lue | Accueil |
NOM | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
SYNOPSIS | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
#include <sys/mman.h> int mprotect(const void *addr, size_t len, int prot);
DESCRIPTION | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
Si le processus appelant essaye d'accéder à la mémoire d'une manière telle que cela viole la protection, le noyau génère un signal SIGSEGV pour ce processus.
prot est soit PROT_NONE, soit un OU binaire « | » entre les valeurs suivantes :
VALEUR RENVOYÉE | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
ERREURS | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
CONFORMITÉ | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
NOTES | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
POSIX.1-2001 indique qu'un implémentation peut permettre un accès autre que celui défini dans prot, mais doit au minimum autoriser l'accès si PROT_WRITE est positionné et ne doit pas l'autoriser si PROT_NONE est positionné.
EXEMPLE | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
Le programme suivant alloue quatre pages de mémoire en faisant de la troisième une page en lecture seule, et exécute une boucle qui vient marcher sur la zone mémoire allouée, modifiant les octets.
$ ./a.out Start of region: 0x804c000 Got SIGSEGV at address: 0x804e000
#include <unistd.h> #include <signal.h> #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <errno.h> #include <sys/mman.h> #define handle_error(msg) \ do { perror(msg); exit(EXIT_FAILURE); } while (0) char *buffer; static void handler(int sig, siginfo_t *si, void *unused) { printf("Got SIGSEGV at address: 0x%lx\n", (long) si->si_addr); exit(EXIT_FAILURE); } int main(int argc, char *argv[]) { int pagesize; struct sigaction sa; sa.sa_flags = SA_SIGINFO; sigemptyset(&sa.sa_mask); sa.sa_sigaction = handler; if (sigaction(SIGSEGV, &sa, NULL) == -1) handle_error("sigaction"); pagesize = sysconf(_SC_PAGE_SIZE); if (pagesize == -1) handle_error("sysconf"); } /* Alloue un tampon aligné sur une frontière de page ; la protection initiale est PROT_READ | PROT_WRITE */ buffer = memalign(pagesize, 4 * pagesize); if (buffer == NULL) handle_error("memalign"); printf("Start of region: 0x%lx\n", (long) buffer); if (mprotect(buffer + pagesize * 2, pagesize, PROT_NONE) == -1) handle_error("mprotect"); } for (p = buffer ; ; ) *(p++) = 'a'; printf("Loop completed\n"); /* Ne devrait jamais arriver */ exit(EXIT_SUCCESS); }
VOIR AUSSI | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
TRADUCTION | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
Ce document est une traduction réalisée par Christophe Blaess <http://www.blaess.fr/christophe/> le 12 octobre 1996 et révisée le 6 juin 2008.
L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 2 mprotect ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.
Sommaire | Début | Suivant | Sommaire | Préc.page.lue | Accueil |
Table des mots clés | Début | Suivant | Sommaire | Préc.page.lue | Accueil |
EACCES | ERREURS |
EFAULT | ERREURS |
EINVAL | ERREURS |
ENOMEM | ERREURS |
PROT_EXEC | DESCRIPTION |
PROT_NONE | DESCRIPTION |
PROT_READ | DESCRIPTION |
PROT_WRITE | DESCRIPTION |