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)