Section: Manual del Programador de Linux (2)
Updated: 22 octubre 1996
Index Return to Main
Contents
msgop - operaciones con mensajes
# include <sys/types.h>
# include <sys/ipc.h>
# include <sys/msg.h>
int msgsnd ( int msqid, struct msgbuf *msgp, int msgsz, int msgflg )
int msgrcv ( int msqid, struct msgbuf *msgp, int msgsz, long msgtyp, int msgflg )
Para enviar o recibir un mensaje, el proceso llamador aloja una estructura como la siguiente:
struct msgbuf {
long mtype;
/* tipo de msj., debe ser > 0 */
char mtext[1];
/* datos del mensaje */
};
pero con un vector
mtext de tamaño msgsz, un valor entero no negativo.
El miembro de la estructura 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 llamador debe tener permiso de acceso de escritura para enviar, y de lectura para recibir un mensaje en la cola.
La llamada al sistema msgsnd encola una copia del mensaje apuntado por el argumento msgp en la cola de mensaje cuyo identificador se especifica por el valor del argumento msqid.
El argumento msgflg especifica el comportamiento de la llamada al sistema si el poner en la cola el nuevo mensaje necesitara más de msg_q bytes en la cola. Si IPC_NOWAIT está definido, el mensaje no será enviado y la llamada al sistema falla regresando con el valor EAGAIN puesto en errno. De otro modo, el proceso se suspende hasta que la condición de la suspensión deje de existir (en cuyo caso el mensaje es enviado y la llamada al sistema acaba con éxito), o la cola se borra (en cuyo caso la llamada al sistema falla con el valor EIDRM en errno), o el proceso recibe una señal que ha de ser capturada (en cuyo caso la llamada al sistema falla con EINTR en errno).
Tras la terminación con éxito de la llamada, la estructura de datos de la cola de mensajes se actualiza como sigue:
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 de la cola, en caso de éxito, el mensaje leído.
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:
El argumento msgflg continene ninguna, una o más (engarzándolas con el operador OR) de entre las siguientes opciones:
Si no hay disponible un mensaje del tipo pedido e IPC_NOWAIT no está contenido en msgflg, el proceso llamador se bloquea hasta que ocurra una de las siguientes condiciones:
Tras la terminación con éxito, la estructura de datos de la cola de mensajes se actualiza como sigue:
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.
Si msgsnd falla, cuando la función regresa, errno cogerá uno de entre los siguientes valores:
Si msgrcv falla, cuando la función regresa, errno tomará uno de entre los valores siguientes:
Los siguientes son límites del sistema que afectan a la llamada al sistema msgsnd :
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).
(5), msgctl(2), msgget(2), msgrcv(2), msgsnd(2)
This document was created by man2html, using
the manual pages.
Time: 06:16:19 GMT, January 22, 2005