Section: Manual del Programador de Linux (2)
Updated: 31 mayo 1997
Index Return to Main
Contents
mprotect - controla el tipo de acceso permitido sobre una región de memoria
#include <sys/mman.h> int mprotect(const void *addr, size_t len, int prot);
controla la forma en que una sección de memoria puede ser accedida. Si un acceso no es permitido por la protección dada, el programa recibe un SIGSEGV.
prot es un O-lógico a nivel de bits de los siguientes valores:
La nueva protección reemplaza cualquier protección existente. Por ejemplo, si la memoria había sido previamente marcada PROT_READ, y mprotect se llama entonces con prot igual a PROT_WRITE, no se prodrá leer.
En caso de éxito, mprotect devuelve cero. En caso de error, se devuelve -1, y se asigna a errno un valor apropiado.
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <sys/mman.h> #include <limits.h> /* por PAGESIZE */ #ifndef PAGESIZE #define PAGESIZE 4096 #endif int main(void) { char *p; char c; /* Reserva un búffer; por defecto, tendrá protección PROT_READ|PROT_WRITE. */ p = malloc(1024+PAGESIZE-1); if (!p) { perror("malloc: imposible reservar 1024 bytes"); exit(errno); } /* Alinear a una dirección múltiplo de PAGESIZE, suponiendo que sea una potencia de 2 */ p = (char *)(((int) p + PAGESIZE-1) & ~(PAGESIZE-1)); c = p[666]; /* Leer; bien */ p[666] = 42; /* Escribir; bien */ /* Marca el búffer como de sólo-lectura. */ if (mprotect(p, 1024, PROT_READ)) { perror("mprotect: imposible cambiar protección"); exit(errno); } c = p[666]; /* Leer; bien */ p[666] = 42; /* Escribir; el programa recibe SIGSEGV y muere*/ exit(0); }
SVr4, POSIX.1b (formalmente POSIX.4). SVr4 define un código de error adicional, EAGAIN. Las condiciones de error de SVr4 coinciden debidamente con las de Linux. POSIX.1b dice que mprotect sólo puede ser usada sobre regiones de memoria obtenidas desde mmap(2).
(2)
This document was created by man2html, using
the manual pages.
Time: 06:16:20 GMT, January 22, 2005