Provided by: manpages-es_1.55-9_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)