Colas de mensajes


Colas de mensajes

Creación y obtención de una cola

msgget - Obtiene una cola de mensajes.

Sintaxis

#include <sys/msg.h>

int msgget( key_t key, int msgflg);

Descripción

La función msgget se utiliza para solicitar al sistema una cola de mensajes referenciada por el parámetro key. Una cola de mensajes se creará mediante esta función si se cumple alguna de las siguientes condiciones:

1. El argumento key toma el valor IPC_PRIVATE.

2. No existe cola de mensajes en el sistema con clave identificadora igual al valor de key y además se ha especificado el flag IPC_CREAT en el parámetro msgflg.

La creación de una cola de mensajes en el sistema implicará que la estructura de control asociada a la cola se inicialice de la siguiente forma:

- msg_perm.cuid, msg_perm.uid, msg_perm.cgid y msg_perm.gid se ponen al valor del identificador de usuario y de grupo efectivo respectivamente del proceso invocador.

- Los 9 bits menos significativos de msg_perm.mode se igualan a los 9 bits menos significativos del parámetro msgflg.

- msg_qnum, msg_lspid, msg_lrpid, msg_stime y msg_rtime se ponen a 0.

- msg_ctime toma el valor de la hora/fecha actual.

- msg_qbytes se pone al límite del sistema.

El retorno de la función msgget será un entero no negativo si ésta se ejecuta con éxito. Dicho valor será el identificador del sistema asociado a la cola referenciada por key. En caso de error, la función retornará -1 y la variable errno tomará el valor del código del error producido.

Envío y recepción de mensajes

msgsnd, msgrcv - Operaciones de envio y recepción de mensajes.

Envío: sintaxis

#include <sys/msg.h>

int msgsnd( int msqid, const void *msgp, void *msgp, size_t msgsz, int msgflg);

Envío: descripción

La función msgsnd envía un mensaje a la cola asociada al identificador del sistema referenciado por el parámetro msqid. El argumento msgp es un puntero al comienzo de la zona de memoria de usuario donde está almacenado el mensaje a enviar, el mensaje debe poseer un campo de comienzo del tipo long en el que se indica el tipo del mensaje, el siguiente campo deberá contener el mensaje própiamente dicho, por ejemplo:

long mi_tipo;

char texto[];

El campo tipo de mensaje, mi_tipo, se podrá utilizar un proceso receptor para seleccionar el tipo de mensajes que desea recibir. El campo del mensaje en sí, texto, deberá poseer una longitud igual al valor especificado en el parámetro msgsz. El último parámetro de msgsnd, msgflg, especifica la acción a realizar si al menos una de las siguientes condiciones se cumple:

1. En la cola de mensajes ya existe uno del tipo especificado, esto se controla mediante el campo msg_qbytes de la estructura de control asociada a la cola de mensajes referenciada.

2. Se ha alcanzado el número máximo de mensajes en las colas del sistema.

Si (msgflg & IPC_NOWAIT) es verdadero, entonces el mensaje no se envia y se produce un retorno inmediato. En caso contrario, es decir, si (msgflg & IPC_NOWAIT) es falso, entonces el proceso invocador suspende la ejecución hasta que alguna de las siguientes condiciones ocurra:

1. La condición responsable para la suspensión ya no se da.

2. La cola referenciada por msqid es eliminada del sistema. Cuando esto ocurre msgsnd retorna con -1 y la variable global errno toma el valor EIDRM.

3. El proceso invocador recibe una señal del sistema. Cuando esto ocurre, el proceso continua su ejecución tal y como establece el tratamiento de señales (ver función signal).

Una vez finalizada con éxito la ejecución de la función msgsnd, se actualizan los siguientes campos de control:

- msg_qnum se incrementa en 1.

- msg_lspid se iguala al identificador del proceso invocador.

- msg_stime toma el valor de la fecha/hora actual.

Recepción: sintaxis

#include <sys/msg.h>

int msgrcv(( int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

Recepción: descripción

La función msgrcv toma un mensaje de la cola especificada por el parámetro msqid y lo copia en la zona de memoria apuntada por msgp. El mensaje recibido tiene una estrura análoga a la del mensaje enviado por emisor. El argumento msgtyp se utiliza para especificar el tipo de mensaje a recibir, concretamente:

- Si msgtyp es igual a 0, entonces se tomará el primer mensaje recibido en la cola.

- Si msgtyp es mayor o igual que 1, entonces el primer mensaje del tipo igual al valor especificado se tomará de la cola.

- Si msgtyp es negativo, entonces el primer mensaje cuyo tipo sea menor o igual que el valor absoluto de msgtyp se tomará de la cola.

El parámetro msgflg especifica la acción que se realizará en el caso que no exista en la cola mensaje alguno del tipo requerido, específicamente:

- Si (msgflg & IPC_NOWAIT) es verdadero, entonces el proceso invocador retornará inmediatamente con un valor de -1 y la variable errno tomará el valor ENOMSG.

- Si (msgflg & IPC_NOWAIT) es falso, entonces el proceso invocador suspenderá la ejecución hasta que se cumpla alguna de las siguientes condiciones:

- Se recibe un mensaje del tipo deseado.

- La cola de mensajes es eliminada del sistema, en este caso se retornará -1 y la variable errno tomará el valor EIDRM.

- Se produce una señal a tratar por el proceso invocador, en este caso se continuará la ejecución de la forma definida en el tratamiento de señales.

Una vez ejecutada con éxito la función msgrcv, alguno campos de control asociados a la cola se actualizan de la siguiente manera:

- msg_qnum se decrementa en 1.

- msg_lrpid se pone al valor del identificador del proceso invocador.

- msg_setime se actualiza actualiza a la fecha/hora actual.

Operaciones de control (ej. borrar cola)

msgctl - Operaciones de control en colas de mensajes.

Sintaxis

#define <sys/msg.h>

int msgctl(int msqid, int cmd, struct msqid_ds *buf);

Descripción

La función msgctl permite realizar operaciones de control en la cola de mensajes especificada por el parámetro msqid. La operación se especifica mediante el argumento cmd, cuyos valores posibles son:

- IPC_STAT: lee la estructura de control asociada a la cola y los deposita en la estructura apuntada por buf.

- IPC_SET: actualiza los campos de control siguientes: msg_perm.uid, msg_perm.gid, msg_perm.mode (sólo los 9 bits menos significativos) y msg_qbytes a los valores que poseen los campos homónimos en la estructura apuntada por buf. Para poder realizar esta operación el proceso invocador debe poseer un identificador igual al usuario "root" o bien coincidir con el valor almacenado en el campo msg_perm.uid o en el campo msg_perm.cuid de la estructura asociada a la cola de mensajes.

- IPC_RMID: elimina la cola de menajes identificada por msqid. Esta orden sólo puede ejecutarla un proceso con identificador de usuario igual al "root" , o igual al campo msg_perm.uid o al campo msg_perm.cuid.

Si la función msgctl se ejecuta con éxito, entonces retornará 0. En caso contrario retornará -1 y la variable global errno tomará un valor igual al código del error producido.