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

NOMBRE

       msgop - operaciones con mensajes

SINOPSIS

       #include <sys/types.h>
       #include <sys/ipc.h>
       #include <sys/msg.h>

       int msgsnd(int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg);

       ssize_t msgrcv(int msqid, struct msgbuf *msgp, size_t msgsz, long msgtyp, int msgflg);

DESCRIPCIÓN

       Para  enviar  o  recibir  un  mensaje,  el  proceso invocador reserva una estructura de la
       siguiente manera genérica:

            struct msgbuf {
                 long mtype;     /* tipo de msj., debe ser > 0 */
                 char mtext[1];  /* datos del mensaje */
            };

       El campo mtext es un vector (u otra estructura) cuyo tamaño viene determinado  por  msgsz,
       un  valor entero no negativo.  Los mensajes de longitud cero (p.e., sin campo mtext) están
       permitidos.  El campo mtype debe tener un valor entero estrictamente  positivo  que  puede
       ser  empleado  por  el proceso receptor para la selección de mensaje (vea la sección sobre
       msgrcv).

       El proceso invocador debe tener permiso de  escritura  para  enviar,  y  de  lectura  para
       recibir un mensaje en la cola.

       La  llamada  al  sistema msgsnd añade una copia del mensaje apuntado por msgp a la cola de
       mensaje cuyo identificador se especifica por el valor de msqid.

       Si hay suficiente espacio disponible en la cola, msgsnd termina con éxito  inmediatamente.
       (La  capacidad  de  la cola está definida por el campo msg_bytes en la estructura de datos
       asociada a la cola de mensajes.  Durante la creación de la cola este campo es inicializado
       a  MSGMNB  bytes,  pero  este  límite  puede  ser  modificado  usando  msgctl.)  Si no hay
       suficiente espacio disponible en la cola, el  comportamiento  por  defecto  de  msgsnd  es
       bloquearse  hasta  que se disponga del espacio.  Si IPC_NOWAIT está contenida en msgflg la
       llamada falla con el error EAGAIN.

       Una llamada msgsnd bloqueada puede fallar también si la cola es eliminada (en tal caso  la
       llamada  al  sistema falla poniendo el valor EIDRM en errno), o si se atrapa una señal (en
       tal caso la llamada al sistem falla poniendo el valor EINTR en errno).  (msgsnd  y  msgrcv
       no  son  nunca  reiniciadas  automáticamente  después  de  haber sido interrumpidas por un
       manejador de señales, a pesar  de  haber  especificado  la  opción  SA_RESTART  cuando  se
       estableció el manejador de señales.)

       Tras la terminación con éxito de la llamada, la estructura de datos de la cola de mensajes
       se actualiza como sigue:

              msg_lspid toma el valor del PID del proceso invocador.

              msg_qnum se incrementa en una unidad.

              msg_stime toma el valor de la hora actual.

       La llamada al sistema msgrcv lee un mensaje de la cola de mensajes especificada por  msqid
       y  lo  guarda  en la estructura msgbuf apuntada por el argumento msgp, borrando el mensaje
       leido de la cola.

       El argumento msgsz especifica el tamaño máximo en  bytes  para  el  miembro  mtext  de  la
       estructura  apuntada  por  el  argumento msgp.  Si el texto del mensaje tiene una longitud
       mayor de msgsz, entonces si el argumento msgflg contiene MSG_NOERROR, el texto del mensaje
       se truncará (y la parte truncada se perderá), y si no, el mensaje no se borra de la cola y
       la llamada al sistema falla regresando y poniendo el valor E2BIG en errno.

       El argumento msgtyp especifica el tipo de mensaje pedido como se muestra a continuación:

              Si msgtyp es 0, entonces se lee el primer mensaje de la cola.

              Si msgtyp es mayor que 0, entonces se lee el primer mensaje en  la  cola  del  tipo
              msgtyp a menos que MSG_EXCEPT estuviera contenido en msgflg, en cuyo caso se lee el
              primer mensaje en la cola de tipo distinto a msgtyp.

              Si msgtyp es menor que 0, entonces se leerá el primer mensaje en  la  cola  con  el
              tipo más bajo menor o igual al valor absoluto de msgtyp.

       El  argumento  msgflg  continene  ninguna, una o más (engarzándolas con el operador OR) de
       entre las siguientes opciones:

              IPC_NOWAIT Para retorno inmediato si no hay en la  cola  ningún  mensaje  del  tipo
              pedido. La llamada al sistema falla con el valor ENOMSG en errno.

              MSG_EXCEPT  Empleado  con msgtyp mayor que 0 para leer el primer mensaje en la cola
              con tipo de mensaje diferente de msgtyp.

              MSG_NOERROR Para truncar el texto del mensaje si es mayor que msgsz bytes.

       Si no hay disponible un mensaje del tipo pedido e IPC_NOWAIT no está contenido en  msgflg,
       el proceso invocador se bloquea hasta que ocurra una de las siguientes condiciones:

              Un mensaje del tipo deseado se ponga en la cola.

              La cola de mensajes se borre del sistema.  En este caso la llamada al sistema falla
              con el valor EIDRM en errno.

              El proceso invocador captura una señal.  En este caso la llamada al  sistema  falla
              con el valor EINTR en errno.

       Tras  la terminación con éxito, la estructura de datos de la cola de mensajes se actualiza
       como sigue:

              msg_lrpid toma el valor del PID del proceso invocador.

              msg_qnum se decrementa en una unidad.

              msg_rtime toma el valor de la hora actual.

VALOR DEVUELTO

       En caso de fallo ambas funciones devuelven -1  con  errno  indicando  el  error,  en  caso
       contrario  msgsnd devuelve 0 y msgrvc devuelve el número de bytes realmente copiados en el
       vector mtext.

ERRORES

       Si msgsnd falla, cuando la función regresa, errno  cogerá  uno  de  entre  los  siguientes
       valores:

       EAGAIN     El  mensaje  no  puede  ser enviado debido al límite para la cola de msg_qbytes
                  bytes, e IPC_NOWAIT estaba contenido en mgsflg.

       EACCES     El proceso invocador no tiene permisos de escritura en la cola de mensajes.

       EFAULT     La dirección apuntada por msgp no es accesible.

       EIDRM      La cola de mensajes fue borrada.

       EINTR      Durmiendo a la espera de una condición de cola de mensajes  llena,  el  proceso
                  capturó una señal.

       EINVAL     Valor inválido para msqid, o  valor no positivo de mtype, o valor inválido para
                  msgsz (menor que 0 ó mayor que el valor del sistema MSGMAX).

       ENOMEM     El  sistema  no  tiene  bastante  memoria  para  hacer  una  copia  del  msgbuf
                  suministrado.

       Si  msgrcv  falla,  cuando  la  función  regresa,  errno  tomará  uno de entre los valores
       siguientes:

       E2BIG      La longitud del texto del mensaje es mayor que  msgsz  y  MSG_NOERROR  no  está
                  contenido en msgflg.

       EACCES     El proceso invocador no tiene permiso de lectura en la cola de mensajes.

       EFAULT     La dirección apuntada por msgp no es accesible.

       EIDRM      Mientras  el  proceso estaba durmiento en espera de recibir un mensaje, la cola
                  de mensajes fue borrada.

       EINTR      Mientras el proceso estaba durmiento  en  espera  de  recibir  un  mensaje,  el
                  proceso recibió una señal que tuvo que ser capturada.

       EINVAL     Valor ilegal de msgqid, o msgsz menor que 0.

       ENOMSG     IPC_NOWAIT  estaba  contenido  en  msgflg  y no existía ningún mensaje del tipo
                  requerido en la cola de mensajes.

OBSERVACIONES

       Los siguientes son límites del sistema que afectan a la llamada al sistema msgsnd:

       MSGMAX     Tamaño máximo para un texto de mensaje: la implementación  pone  esta  valor  a
                  8192 bytes.

       MSGMNB     Tamaño  máximo predeterminado en bytes de una cola de mensaje: 16384 bytes.  El
                  super-usuario puede incrementar el tamaño de una cola de mensajes más  allá  de
                  MSGMNB a través de la llamada al sistema msgctl.

       La  implementación  no  tiene  límites  intrínsecos para el número máximo, del sistema, de
       cabeceras de mensaje (MSGTQL) ni para el tamaño máximo, del sistema, en bytes, de la  zona
       común de mensajes (MSGPOOL).

CONFORME A

       SVr4, SVID.

NOTA

       El  argumento  de  tipo puntero está declarado como struct msgbuf * en libc4, libc5, glibc
       2.0, glibc 2.1. Está declarado como void * (const void *  para  msgsnd())  en  glibc  2.2,
       siguiendo el estándar SUSv2.

VÉASE TAMBIÉN

       ipc(5), msgctl(2), msgget(2), msgrcv(2), msgsnd(2)