Está en la página 1de 6

MDULO II: PROGRAMACIN CONCURRENTE

COLAS DE MENSAJES. 1.Conceptos gener !es "e co! s "e #ens $es.

Una cola de mensajes es una estructura de datos gestionada por el kernel, en la cual van a poder escribir y leer los procesos que se ejecuten en el sistema. Los mecanismos de sincronismo para que no se produzca colisin son responsabilidad del kernel. Los datos que se escriben en la cola deben tener formato de mensaje y son tratados como un todo indivisible. La estructura de datos que forma la cola de mensajes tiene una forma definida: un identificador, un campo que marca el tipo de mensaje, y un rea de datos. una cola de mensajes puede acceder cualquier proceso que conozca su identificador y tenga los permisos necesarios, pudiendo leer y escribir en ella. !l kernel gestiona las colas de mensajes como un mecanismo "#"$ %first input, first output&, es decir, el primer mensaje escrito en la cola ser el primero en salir de ella al realizar una lectura. 'in embargo, para dotar de ms fle(ibilidad, se pueden )acer peticiones de lectura que e(traigan mensajes de un tipo determinado, con lo que se rompe la gestin de tipo "#"$, aunque *sta se sigue manteniendo para todos aquellos mensajes que son de un mismo tipo. !sta clasificacin de los mensajes por tipos permite distinguir cules son los mensajes que van destinados a cada uno de los procesos lectores.

%.-

Cre c&'n "e (n co! "e #ens $es.

La funcin msgget permite crear una cola de mensajes o )abilitar el acceso a una ya e(istente. 'u declaracin es la siguiente: #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> int msgget (clave, opcin); key_t clave; int opcin; /* clave de la cola de mensa es */ /* opcin pa!a la c!eacin */

'i la llamada funciona correctamente, devolver el identificador de la cola de mensajes creada o )abilitada+ en caso contrario, devolver el valor ,-. !l primer parmetro, clave, es una llave de acceso, que tiene el mismo significado que el visto para los semforos y los segmentos de memoria compartida. !l parmetro opcin es una mscara de bits con la que se define los permisos de acceso a la cola de mensajes y el modo de adquirir el identificador de la misma. !s

. !./.0.

decir, posee el mismo significado que el visto para la mscara opcin de los dos #12 estudiados anteriormente. !l identificador de la cola de mensajes que devuelve esta funcin es )eredado por todos los procesos descendientes del que llama a dic)a funcin. !l siguiente trozo de cdigo muestra cmo se crea una cola de mensajes, donde slo el propietario va a tener permiso de lectura y escritura: #de"ine ##$%& (key_t)'() int ms*id; /* clave de acceso */

/* identi"icado! de la nueva o ha+ilitada cola de mensa es */

i"((ms*id,msgget(##$%&, -./_/0&$1 2 3433)) ,, 56) 7 /* &!!o! al c!ea! o ha+ilita! la cola de mensa es. 1!atamiento del e!!o!. */ 8

).-

Contro! "e ! s co! s "e #ens $es.

La funcin msgctl proporciona informacin administrativa y de control sobre la cola de mensajes que se especifique. 'u declaracin es la siguiente: #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> int msgctl (ms*id, op, p_+u"); int ms*id; int op; st!uct ms*id_ds *p_+u"; /* identi"icado! de la cola de mensa es */ /* ope!acin a e"ectua! */ /* a!gumento de la ope!acin */

!sta funcin act3a sobre la cola de mensajes cuyo identificador es ms*uid %identificador que devolvi la llamada a la funcin msgget&. !l segundo parmetro op indica el tipo de operacin de control que se desea realizar. 'us posibles valores son: Oper c&'n #124'5 5 #124'!5 #12406#7 E*ecto Lee la informacin administrativa y la almacena en la zona de memoria apuntada por p4buf. 6odifica la informacin administrativa, para lo cual dic)a informacin debe estar almacenada previamente en p4buf. #ndica al kernel que borre la cola de mensajes. !sto no ser efectivo mientras que e(ista alg3n proceso usando dic)a cola.

La llamada a esta funcin devuelve el valor 8 si se ejecuta satisfactoriamente, y ,- si se )a producido alg3n fallo.

. !./.0.

!l siguiente trozo de cdigo muestra como se borra una cola de mensajes previamente creada: int ms*id; .... i"(msgctl (ms*id, -./_09-:,3) ,, 56) 7 /* &!!o! al elimina! la cola de mensa es. 1!atamiento del e!!o!. */ 8 /* identi"icado! de la cola de mensa es */

+.-

Oper c&ones con co! s "e #ens $es.

'obre una cola de mensajes un proceso puede leer y escribir mensajes. Las llamadas al sistema que permiten realizar estas dos operaciones son las siguientes: msgsnd !sta funcin realiza el env:o de un mensaje contenido en memoria a una cola de mensajes. 'u declaracin es: #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> int msgsnd (ms*id, p_mes, lg, opcion); int ms*id; st!uct msg+u" *p_mes; int lg; int opcion; /* identi"icado! de la cola de mensa es */ /* punte!o al mensa e a envia! */ /* longitud del mensa e */ /* opcin de la emisin */

9s*id es el identificador de la cola de mensajes sobre la que se env:a el mensaje contenido en la direccin p_mes, es decir+ p_mes apunta al buffer %zona de memoria& definido por el usuario, que contiene el mensaje a enviar. !ste buffer es una estructura, normalmente con dos campos, donde el primer campo debe ser de tipo long e identifica el tipo de mensaje y el segundo, contendr la informacin a transmitir, cuyo tama;o es variable. <o e(isten tipos definidos por el sistema+ por tanto, la clasificacin de los mensajes depende del programador. !l parmetro lg contiene el tama;o, en bytes, del mensaje, es decir, sin tener en cuenta el espacio que ocupa el tipo del mensaje. 1or 3ltimo, el parmetro opcion es una mscara de bits que permite especificar el comportamiento del proceso emisor en el caso de que no pueda enviarse el mensaje por causa de la carga del mecanismo de colas de mensajes %demasiados mensajes o cola llena&. 1or defecto, en estas circunstancias la funcin es bloqueante %detiene la ejecucin del proceso emisor&. 7ic)o proceso se despertar cuando sea posible la escritura del mensaje en la cola. 'in embargo, si el bit #124<$= #5 est activo, la llamada es no

. !./.0.

>

bloqueante, es decir+ la llamada devuelve el control inmediatamente y retorna el valor ?- informando de que no )a sido posible colocar el mensaje en la cola. msg!cv !sta funcin permite e(traer de modo efectivo un mensaje de un tipo dado de una cola de mensajes y almacenar su contenido en la direccin especificada. 'u declaracin es la siguiente: #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> int msg!cv (ms*id, p_mes, lgma;, tipo, opcion); int ms*id; st!uct msg+u" *p_mes; int lgma;; long tipo; int opcion; /* identi"icado! de la cola de mensa es */ /* punte!o a la <ona !ese!vada */ /* longitud m=;ima *ue se puede acepta! */ /* tipo del mensa e espe!ado */ /* opcin de la !ecepcin */

9s*id especifica el identificador de la cola de mensajes de la cual se pretende leer un mensaje. @ste ser colocado en el buffer al que apunta p_mes, que deber )aber sido definido por el usuario previamente. !l parmetro lgma; indica el tama;o m(imo del mensaje que se puede e(traer %*ste depender esencialmente del tama;o del espacio reservado para el mensaje sin contar los bytes que ocupa el tipo de mensaje&. La peticin de e(traccin de un mensaje ms largo supone un fracaso, a menos que en el parmetro opcin se tenga activo el bit 6'/4<$!00$0, que entonces se e(trae el mensaje en su totalidad y se trunca al tama;o especificado por lgma;. !n el caso de que la llamada se realice, *sta devuelve un valor igual a la longitud del mensaje, y si se )a producido un truncamiento, el proceso no recibe ninguna informacin sobre ello %es decir+ no es posible conocer el n3mero de caracteres perdidos&. !l parmetro tipo indica qu* mensaje se quiere e(traer %para ello se compara su valor con el campo tipo de la estructura de cada mensaje& de la siguiente forma: a& tipoA8 se leer el primer mensaje que )aya en la cola %cualquiera que sea su tipo&. b& tipoB8 se leer el primer mensaje de la cola cuyo identificador de tipo particular coincida con *ste. c& tipoC8 se leer el primer mensaje de la cola cuyo identificador de tipo particular sea menor o igual que *ste. 1or defecto, la llamada a esta funcin es bloqueante, es decir+ el proceso que la invoca se suspende si no e(iste ning3n mensaje en la cola que tenga un identificador de tipo particular coincidente con el parmetro tipo, y se despertar cuando llegue un mensaje que satisfaga la peticin.

. !./.0.

'in embargo, si el parmetro opcin especifica que el bit #124<$= #5 esta activo, entonces la llamada devuelve inmediatamente el control y retorna el valor ?- indicando que no )a sido posible leer un mensaje de las caracter:sticas especificadas. !l siguiente trozo de cdigo muestra como se puede crear una cola de mensajes con el fin de enviar y recibir un mensaje del tipo -, que se compone de una caden de 98 caracteres. #de"ine ##$%& (key_t)'() #de"ine 9$> '3 int ms*id; st!uct 7 long tipo; cha! cadena?9$>@; 8 mensa e; int longitud,si<eo"(mensa e)5si<eo"(mensa e.tipo); .... /* /!eacin de la cola de mensa es */ i"((ms*id,msgget(##$%&, -./_/0&$1 2 3433)) ,, 56) 7 p!int"(A&!!o! al c!ea! la cola de mensa es BnC); e;it(56); 8 /* &nvio de un mensa e */ mensa e.tipo,6; st!cpy(mensa e.cadena, AholaC); i"(msgsnd(ms*id, Dmensa e, longitud, 3) ,, 56) 7 p!int"(A&!!o! al envia! un mensa e a la cola de mensa es BnC); e;it(56); 8 /* 0ecepcin del mensa e */ i"(msg!cv(ms*id, Dmensa e, longitud, 6, 3) ,, 56) 7 p!int"(A&!!o! al lee! un mensa e de la cola de mensa es BnC); e;it(56); 8 p!int"(A&l mensa e leido es EsBnC, mensa e.cadena); /* Fo!!ado de la cola de mensa es */ i"(msgctl(ms*id, -./09-:, 3) ,, 56) 7 p!int"(A&!!o! al elimina! la cola de mensa es BnC); e;it(56);

. !./.0.

8 ...

. !./.0.

También podría gustarte