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).
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)