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)