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