Provided by: manpages-es_1.55-10_all bug

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)