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)

Linux 2.4.18                                      1 junio 2002                                          MSGOP(2)