#include <sys/mman.h> int mprotect(const void *addr, size_t len, int prot);
Si le processus appelant essaie 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 :
POSIX.1-2001 indique qu'une implémentation peut permettre un accès autre que celui défini dans prot, mais doit au minimum autoriser l'accès en écriture si PROT_WRITE est positionné et ne doit autoriser aucun accès si PROT_NONE est positionné.
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 Début de la région : 0x804c000 Reçu SIGSEGV à l'adresse : 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("Reçu SIGSEGV à l'adresse : 0x%lx\n", (long) si->si_addr); exit(EXIT_FAILURE); } int main(int argc, char *argv[]) { char *p; 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("Début de la région : 0x%lx\n", (long) buffer); if (mprotect(buffer + pagesize * 2, pagesize, PROT_NONE) == -1) handle_error("mprotect"); for (p = buffer ; ; ) *(p++) = aqaaq; printf("Boucle terminée\n"); /* Ne devrait jamais arriver */ exit(EXIT_SUCCESS); }
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 24 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.
Dernière mise à jour : 24 juin 2008