Provided by: manpages-es_1.55-10_all bug

NOMBRE

       shmctl - control de memoria compartida

SINOPSIS

       #include <sys/ipc.h>

       #include <sys/shm.h>

       int shmctl(int shmid, int cmd, struct shmid_ds *buf);

DESCRIPCIÓN

       shmctl()  permite  al usuario recibir información sobre un segmento de memoria compartida,
       establecer el dueño, grupo y permisos del segmento, así como  destruirlo.  La  información
       sobre el segmento identificado como shmid se devuelve en una estructura shmid_ds:

           struct shmid_ds {
               struct ipc_perm shm_perm;  /* permisos de operación */
               int shm_segsz;             /* tamaño del segmento (bytes) */
               time_t shm_atime;          /* tiempo de la última unión */
               time_t shm_dtime;          /* tiempo de la última separación */
               time_t shm_ctime;          /* tiempo de la última modificación */
               unsigned short shm_cpid;   /* pid del creador */
               unsigned short shm_lpid;   /* pid of último operador */
               short shm_nattch;          /* nº. de uniones actuales */
               ...
           };

       Los campos resaltados del miembro shm_perm pueden ser modificados:

           struct ipc_perm {
               key_t  key;
               ushort uid;   /* euid y egid del propietario */
               ushort gid;
               ushort cuid;  /* euid y egid del creador */
               ushort cgid;
               ushort mode;  /* 9 bits más bajos de los modos de acceso */
               ushort seq;   /* número de secuencia */
           };

       Están disponibles los siguientes cmds:

       IPC_STAT    se  usa  para copiar la información sobre el segmento de memoria compartida en
                   la memoria intermedia buf. El  usuario  debe  tener  permiso  de  lectura  del
                   segmento de memoria compartida.

       IPC_SET     se  usa  para  aplicar los cambios que el usuario ha efectuado en los miembros
                   uid, gid, o mode del campo shm_perms. Sólo se usan los 9  bits  más  bajos  de
                   mode.   El  miembro  shm_ctime  también es actualizado. El usuario debe ser el
                   dueño, creador o el superusuario.

       IPC_RMID    se usa para marcar el segmento  como  destruido.  En  realidad,  se  destruirá
                   después  de la última separación (es decir, cuando el miembro shm_nattch de la
                   estructura asociada shmid_ds sea cero). El usuario debe ser el dueño,  creador
                   o el superusuario.

       El  usuario  debe asegurarse de que el segmento se destruye al final; de lo contrario, las
       páginas de dicho segmento que se cargaron en memoria  al  producir  un  fallo  de  página,
       permanecerán en memoria o en el fichero de intercambio.

       Además,  el  superusuario  puede  impedir o permitir que un segmento de memoria compartida
       pase al fichero de intercambio con las siguientes órdenes (sólo Linux):

       SHM_LOCK    impide que un segmento de memoria compartida pase al fichero  de  intercambio.
                   El  usuario  debe cargar en memoria mediante fallos de página cualquier página
                   que necesite estar presente después de que se habilite el bloqueo.

       SHM_UNLOCK  permite sacar del fichero de intercambio al segmento de memoria compartida.

       Las llamadas de control IPC_INFO, SHM_STAT y SHM_INFO son usadas por el  programa  ipcs(8)
       para proporcionar información sobre los recursos asignados. En el futuro, éstos pueden ser
       modificados según se necesite o movidos a un sistema de ficheros proc.

VALOR DEVUELTO

       En caso de éxito se devuelve 0, en caso de error -1.

ERRORES

       En caso de error, errno tomará uno de los siguientes valores:

       EACCES      se devuelve si se pide IPC_STAT y shm_perm.modes no permite acceso de  lectura
                   para shmid.

       EFAULT      el  argumento cmd tiene el valor IPC_SET o IPC_STAT pero la dirección apuntada
                   por buf no es accesible.

       EINVAL      se devuelve si shmid no es un identificador válido  o  cmd  no  es  una  orden
                   válida.

       EIDRM       se devuelve si shmid apunta a un identificador borrado.

       EPERM       se  devuelve  si  se  intenta IPC_SET o IPC_RMID y el identificador de usuario
                   efectivo  del  proceso  invocador  no  es  el   creador   (según   figura   en
                   shm_perm.cuid),  el  propietario  (según  figura en shm_perm.uid), o el super-
                   usuario.

       EOVERFLOW   se devuelve si se intenta IPC_STAT, y el valor gid o uid es  demasiado  grande
                   para ser almacenado en la estructura apuntada por buf.

NOTA

       Algunos  campos  de  la  estructura  shmid_ds  eran  de tipo short bajo Linux 2.2 y se han
       convertido  a  long  en  Linux  2.4.  Para  aprovecharse  de  ésto,  debería  bastar   una
       recompilación  bajo  glibc-2.1.91  o  alguna  versión posterior.  (El núcleo distingue las
       llamadas antiguas y nuevas por una bandera IPC_64 en cmd.)

CONFORME A

       SVr4, SVID.  SVr4 documenta las condiciones de error adicionales EINVAL,  ENOENT,  ENOSPC,
       ENOMEM, EEXIST. Ni SVr4 ni SVID documentan una condición de error EIDRM.

VÉASE TAMBIÉN

       shmget(2), shmop(2)