MSGOP(2) | Manual del Programador de Linux | MSGOP(2) |
msgop - operaciones con mensajes
#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);
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:
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:
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 invocador 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).
SVr4, SVID.
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.
1 junio 2002 | Linux 2.4.18 |