msgget - Obtiene una cola de mensajes.
#include <sys/msg.h>
int msgget( key_t key, int
msgflg);
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.
msgsnd, msgrcv - Operaciones de envio y recepción de
mensajes.
#include <sys/msg.h>
int msgsnd( int msqid, const void
*msgp, void *msgp, size_t
msgsz, int msgflg);
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.
#include <sys/msg.h>
int msgrcv(( int msqid, void
*msgp, size_t msgsz, long
msgtyp, int msgflg);
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.
msgctl - Operaciones de control en colas de mensajes.
#define <sys/msg.h>
int msgctl(int msqid, int cmd,
struct msqid_ds *buf);
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.