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)