bionic (2) shmop.2.gz

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)