bionic (2) msgop.2.gz

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)