Provided by:
manpages-es_1.55-10_all 
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'ON
La funcion shmat pega el segmento de memoria compartida identificada
por shmid al espacio de direcciones del proceso que llama a la funcion.
La direccion del pegado se especifica en shmaddr segun uno de los
criterios siguientes:
Si shmaddr es NULL, el sistema escoge una direccion adecuada (sin
utilizar) en donde pegar el segmento.
Si shmaddr no es NULL y SHM_RND esta activado en shmflg, el pegado
ocurre en la direccion igual al redondeo por abajo de shmaddr al
multiplo mas cercano de SHMLBA. De otro modo, shmaddr debe ser una
direccion alineada de una pagina en la cual ocurra el pegado.
Si SHM_RDONLY esta 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 nocion de un
segmento de memoria compartida de escritura exclusiva.
La bandera (especifica de Linux) SHM_REMAP puede ser activada en shmflg
para indicar que la correspondencia del segmento deberia reemplazar
cualquier correspondencia existente en el rango que comienza en shmaddr
y continua hasta el tamano del segmento. (Normalmente se produciria 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 funcion no se altera por el pegado. El
segmento se despegara automaticamente cuendo el proceso se acabe. El
mismo segmento puede ser pegaado como de lectura y de lectura-
escritura, y mas 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 exito tambien si el segmento de memoria
compartida se marca como para ser borrado.
La funcion shmdt despega el segmento de memoria compartida localizado
en la direccion 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
esta marcado para ser borrado, el segmento se borra.
La region ocupada en el espacio de usuario del proceso llamador es
desasociada.
LLAMADAS AL SISTEMA
fork() Despues 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 exito shmat devuelve la direccion 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 invalido, no alineado (i.e., sin alineamiento
de pagina y SHM_RND no se especifico), o valor de shmaddr
invalido, o pegado fallido en brk, o se especifico SHM_REMAP
y shmaddr era NULL.
ENOMEM No se pudo reservar memoria para el descriptor o para las
tablas de pagina.
La funcion shmdt puede fallar solo si no hay segmento de memoria
compartida pegada en shmaddr, en cuyo caso al regresar errno tendra 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 direccion de comienzo del segmento),
en lugar de absoluto.
El siguiente parametro del sistema afecta a shmat:
SHMLBA Direccion del limite inferior del segmento. Debe estar
alineado a pagina. Para la implementacion actual el valor
de SHMBLA es PAGE_SIZE.
La implementacion no tiene un limite intrinseco para el numero maximo
de segmentos de memoria compartida por proceso (SHMSEG).
CONFORME A
SVr4, SVID. SVr4 documenta una condicion de error adicional EMFILE.
En SVID-v4, el tipo del argumento shmaddr se cambio 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'EASE TAMBI'EN
brk(2), ipc(5), mmap(2), shmctl(2), shmget(2)