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.