Provided by:
manpages-es_1.55-10_all 
NOMBRE
mprotect - controla el tipo de acceso permitido sobre una region de
memoria
SINOPSIS
#include <sys/mman.h>
int mprotect(const void *addr, size_t len, int prot);
DESCRIPCI'ON
mprotect controla la forma en que una seccion de memoria puede ser
accedida. Si un acceso no es permitido por la proteccion dada, el
programa recibe un SIGSEGV.
prot es un O-logico a nivel de bits de los siguientes valores:
PROT_NONE La memoria no puede ser accedida de ninguna forma.
PROT_READ La memoria puede ser leida.
PROT_WRITE La memoria puede ser escrita.
PROT_EXEC La memoria puede contener codigo ejecutable.
La nueva proteccion reemplaza cualquier proteccion existente. Por
ejemplo, si la memoria habia sido previamente marcada PROT_READ, y
mprotect se llama entonces con prot igual a PROT_WRITE, no se prodra
leer.
VALOR DEVUELTO
En caso de exito, mprotect devuelve cero. En caso de error, se
devuelve -1, y se asigna a errno un valor apropiado.
ERRORES
EINVAL addr no es un puntero valido, o no es un multiplo de PAGESIZE.
EFAULT La memoria no puede ser accedida.
EACCES La memoria no permite el acceso especificado. Esto puede
ocurrir si, por ejemplo, asocia a una zona de memoria mediante
mmap(2) un fichero al cual solo tiene acceso de lectura y pide a
mprotect que lo marque PROT_WRITE.
ENOMEM No se han podido reservar estructuras internas del nucleo.
EJEMPLO
#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 buffer; por defecto, tendra
proteccion PROT_READ|PROT_WRITE. */
p = malloc(1024+PAGESIZE-1);
if (!p) {
perror("malloc: imposible reservar 1024 bytes");
exit(errno);
}
/* Alinear a una direccion multiplo 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 buffer como de solo-lectura. */
if (mprotect(p, 1024, PROT_READ)) {
perror("mprotect: imposible cambiar proteccion");
exit(errno);
}
c = p[666]; /* Leer; bien */
p[666] = 42; /* Escribir; el programa recibe SIGSEGV
y muere*/
exit(0);
}
CONFORME A
SVr4, POSIX.1b (formalmente POSIX.4). SVr4 define un codigo de error
adicional, EAGAIN. Las condiciones de error de SVr4 coinciden
debidamente con las de Linux. POSIX.1b dice que mprotect solo puede
ser usada sobre regiones de memoria obtenidas desde mmap(2).
V'EASE TAMBI'EN
mmap(2)