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

NOMBRE

       shmop - operaciones con memoria compartida

SINOPSIS

       #include <sys/types.h>
       #include <sys/shm.h>

       void *shmat(int shmid, const void *shmaddr, int shmflg);

       int shmdt(const void *shmaddr);

DESCRIPCIÓN

       La  función shmat pega el segmento de memoria compartida identificada por shmid al espacio de direcciones
       del proceso que llama a la función.  La dirección del pegado se especifica en shmaddr según  uno  de  los
       criterios siguientes:

       Si shmaddr es NULL, el sistema escoge una dirección adecuada (sin utilizar) en donde pegar el segmento.

       Si  shmaddr  no  es  NULL  y  SHM_RND  está activado en shmflg, el pegado ocurre en la dirección igual al
       redondeo por abajo de shmaddr al múltiplo más cercano de SHMLBA.  De otro  modo,  shmaddr  debe  ser  una
       dirección alineada de una página en la cual ocurra el pegado.

       Si  SHM_RDONLY  está activado en shmflg, el segmento se pega para lectura y el proceso debe tener permiso
       de lectura en el segmento.  De otro modo el segmento se pega  para  lectura  y  escritura  y  debe  tener
       permisos  de lectura y escritura en el segmento. No existe la noción de un segmento de memoria compartida
       de escritura exclusiva.

       La  bandera  (específica  de  Linux)  SHM_REMAP  puede  ser  activada  en  shmflg  para  indicar  que  la
       correspondencia  del  segmento  debería  reemplazar  cualquier  correspondencia existente en el rango que
       comienza en shmaddr y continua hasta el tamaño del segmento.  (Normalmente se produciría un error  EINVAL
       si  ya  existiera  una  correspondencia en este rango de direcciones.)  En este caso, shmaddr no debe ser
       NULL.  El valor de brk del proceso que llama a la función no se altera por el  pegado.   El  segmento  se
       despegará  automáticamente  cuendo  el  proceso  se  acabe.   El mismo segmento puede ser pegaado como de
       lectura y de lectura-escritura, y más de una vez, en el espacio de direcciones del proceso.

       Tras una llamada exitosa a shmat el sistema actualiza los miembros de la estructura shmid_ds asociada  al
       segmento de memoria compartida como sigue:

              shm_atime toma el valor de la hora actual.

              shm_lpid toma el valor del PID del proceso llamador.

              shm_nattch se incrementa en uno.

       Observe  que  el  pegado  tiene éxito también si el segmento de memoria compartida se marca como para ser
       borrado.

       La función shmdt despega el segmento de memoria compartida localizado en la  dirección  especificada  por
       shmaddr  del  espacio  de  direcciones  del  proceso  invocador.   El segmento a ser despegado debe estar
       actualmente pegado con shmaddr igual al valor devuelto por su llamada de pegado shmat.

       Tras una llamada exitosa a shmdt el sistema actualiza los miembros de la estructura shmid_ds asociada  al
       segmento de memoria compartida como sigue:

              shm_dtime toma el valor de la hora actual.

              shm_lpid toma el valor del PID del proceso llamador.

              shm_nattch  se  decrementa  en  uno.  Si llega a 0 y el segmento está marcado para ser borrado, el
              segmento se borra.

       La región ocupada en el espacio de usuario del proceso llamador es desasociada.

LLAMADAS AL SISTEMA

       fork() Después de un fork() el hijo hereda los segmentos de memoria compartidos pegados.

       exec() Tras un exec() todos los segmentos de memoria compartida pegados son despegados del proceso.

       exit() Tras exit() todos los segmentos de memoria compartida pegados son despegados del proceso.

VALOR DEVUELTO

       En caso de fallo ambas funciones devuelven -1 con errno indicando el  error.   En  caso  de  éxito  shmat
       devuelve la dirección del segmento de memoria compartido pegado, y shmdt devuelve 0.

ERRORES

       Cuando shmat falla errno tiene uno de entre los siguientes valores:

       EACCES     El proceso llamador no tiene permisos de acceso para el tipo de pegado pedido.

       EINVAL     Valor  de  shmid  inválido,  no  alineado  (i.e.,  sin  alineamiento de página y SHM_RND no se
                  especificó), o valor de shmaddr inválido, o pegado fallido en brk, o se especificó SHM_REMAP y
                  shmaddr era NULL.

       ENOMEM     No se pudo reservar memoria para el descriptor o para las tablas de página.

       La función shmdt puede fallar sólo si no hay segmento de memoria compartida pegada en  shmaddr,  en  cuyo
       caso al regresar errno tendrá el valor EINVAL.

OBSERVACIONES

       Usar  shmat  con  shmaddr  igual a NULL es la manera portable y preferida de pegar un segmento de memoria
       compartida.  Sea consciente de que el segmento de memoria compartida pegado  de  esta  manera  puede  ser
       pegado  en  diferentes direcciones en diferentes procesos.  Por consiguiente, cualquier puntero mantenido
       dentro de la memoria compartida debe ser hecho relativo (habitualmente a la  dirección  de  comienzo  del
       segmento), en lugar de absoluto.

       El siguiente parámetro del sistema afecta a shmat:

       SHMLBA     Dirección  del  límite  inferior  del  segmento.  Debe  estar  alineado  a  página.   Para  la
                  implementación actual el valor de SHMBLA es PAGE_SIZE.

       La implementación no tiene un límite intrínseco para el número máximo de segmentos de memoria  compartida
       por proceso (SHMSEG).

CONFORME A

       SVr4,  SVID.   SVr4 documenta una condición de error adicional EMFILE.  En SVID-v4, el tipo del argumento
       shmaddr se cambió de char * a const void *, y el tipo del valor devuelto por shmat() de char * a void  *.
       (Linux libc4 y libc5 poseen los prototipos char *.  glibc2 posee void *.)

VÉASE TAMBIÉN

       brk(2), ipc(5), mmap(2), shmctl(2), shmget(2)

Linux 2.5                                         5 enero 2002                                          SHMOP(2)