Está en la página 1de 4

ESCUELA POLIT

ECNICA NACIONAL, FACULTAD DE INGENIER

IA DE SISTEMAS, MOLINA, DEBER NO. 3 1


DEBER No. 3
Samantha Molina
gloomyfairy@hotmail.es
10 de abril de 2014
El presente documento contiene informaci on acerca de los mecanismos de comunicaci on interprocesos de forma permanente, el
m etodo de comunicaci on utilizado es la cola de mensajes. La cola de mensaje permite que varios procesos se comunicaquen entre
s, ya que comparten la misma memoria. Los mecanismos de intercomunicaci on son importantes, debido a que permiten que los
procesos puedan compartir informaci on y datos entre s.
Index Termscomuninicaci on interprocesos, cola de mensajes.
I. INTRODUCI ON
L
OS mecanismos de comunicaci on interprocesos (IPC)
permanentes se mantienen en el tiempo, es decir no
se eliminan al terminar su funci on. Los IPCs permanentes
existentes son: Segmentos de memoria compartida, Matrices
de sem aforos y Colas de mensajes. Estos mecanismos tienen
su propia estructura interna.
II. METODOLOGIA
II-A. Programa
II-A1. Descripci on de la Fase 1
La cola de mensajes debe ser creada y abierta para permitir
la comunicaci on interprocesos. Durante la creaci on se le
asigana un identicador de cola, este permite a los procesos
acceder a la cola que deseen para comunicarse entre s.
II-A2. C odigo de la creaci on de la cola de mensajes
/
*
creacion.c
*
/
#include <sys/types.h>
#include <sys/ipc.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#define BUFSZ 512
struct msg{
long msg_type;
char msg_text[BUFSZ];
};
int main(){
int qid;
int len;
struct msg pmsg;
qid=0;
puts("Ingrese el mensaje a enviar: ");
if((fgets((&pmsg)->msg_text,BUFSZ,stdin))==NULL)
{
puts("\n no hay mensajes para enviar\n");
fflush(stdout);
exit(EXIT_SUCCESS);
Marzo 2014, Samantha Molina, EPN
}
pmsg.msg_type=getpid();
len=strlen(pmsg.msg_text);
printf("\n Longitud del mensaje = %d \n", len);
if((msgsnd(qid, &pmsg, len, 0))<0){
perror("msgsnd");
exit(EXIT_FAILURE);
}
puts("mensaje enviado");
exit(EXIT_SUCCESS);
}
Para enviar un mensaje el proceso primero debe crearlo y
almacenarlo en la cola, para esto se utiliza un struct mgs y
crea una variable tipo msg. El proceso modica esta variable
mediante un puntero que apunta a su direcci on de memoria.
II-A3. C odigo de la grabaci on del mensaje
/
*
grabacion.c
*
/
#include <sys/types.h>
#include <sys/ipc.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#define BUFSZ 512
struct msg{
long msg_type;
char msg_text[BUFSZ];
};
int main(){
int qid;
int len;
struct msg pmsg;
qid=0;
puts("Ingrese el mensaje a enviar: ");
if((fgets((&pmsg)->msg_text, BUFSZ, stdin))==NULL)
{
puts("\n no hay mensajes para enviar\n");
fflush(stdout);
exit(EXIT_SUCCESS);
}
pmsg.msg_type=getpid();
len=strlen(pmsg.msg_text);
printf("\n Longitud del mensaje = %d \n", len);
if((msgsnd(qid, &pmsg, len, 0))<0){
ESCUELA POLIT

ECNICA NACIONAL, FACULTAD DE INGENIER

IA DE SISTEMAS, MOLINA, DEBER NO. 3 2


perror("msgsnd");
exit(EXIT_FAILURE);
}
puts("mensaje enviado");
exit(EXIT_SUCCESS);
}
Para leer el mensaje, el proceso debe acceder a la cola
mediante el identicador de cola. Una vez dentro de la cola,
acceder a a la variable de tipo msg creada en la parte de
grabaci on.
II-A4. C odigo de la lectura del mensaje
/
*
lectura.c
*
/
#include <sys/types.h>
#include <sys/ipc.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#define BUFSZ 512
struct msg{
long msg_type;
char msg_text[BUFSZ];
};
int main()
{
int qid;
int len;
struct msg pmsg;
qid=0;
len=msgrcv(qid, &pmsg, BUFSZ, 0,0);
if(len>0)
{
printf("\n lectura de la cola id = %d \n", qid);
printf("\ttipo de mensaje: %05d\n",(&pmsg)->msg_type);
printf("\ttexto del mensaje: %s\n",(&pmsg)->msg_text);
}else{
perror("msgrcv");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
II-A5. Descripci on de la Fase 2
Se crean dos procesos, mediante un fork, que compartan
la misma cola de mensajes y se comuniquen entre s. Para
crear la cola de mensajes se utiliz o el c odigo de creacion.c,
y mediante el c odigo de grabacion.c el Proceso 1 envo el
mensaje al Proceso 2 que lo ley o con el c odigo de lectura.c.
II-A6. C odigo de la Fase 2
/
*
fase 2
*
/
int main(){
int i;
creacion();
i = fork();
printf("i=%d\n", i);
if(i!=0){
sleep(15);
printf("\nRecepcion del mensaje por el Proceso 2");
lectura();
}else{
printf("\nEnvio del mensaje del Proceso 1");
grabacion();
}
exit(EXIT_SUCCESS);
sleep(25);
}
II-A7. Descripci on de la Fase 3
Se crean diez procesos, mediante fork, de los cuales cinco
deben enviar el mensaje mediante el c odigo grabacion.c y
los otros cinco deben leer los mensaje enviados mediante
el c odigo de lectura.c. Para crear la cola de mensajes se
utiliz o el c odigo de creacion.c.
II-A8. C odigo de la Fase 3
/
*
fase 3
*
/
int main(){
int i, j, k, l, m;
creacion();
i = fork();
if(i!=0){
printf("\nGrabacion 1\n");
grabacion();
j=fork();
if(j!=0){
printf("\nGrabacion 2\n");
grabacion();
k=fork();
if(k!=0){
printf("\nGrabacion 3\n");
grabacion();
l=fork();
if(l!=0){
printf("\nGrabacion 4\n");
grabacion();
m=fork();
if(m!=0){
printf("\nGrabacion 5\n");
grabacion();
m=fork();
if(m!=0){
printf("\nLectura 1\n");
lectura();
m=fork();
if(m!=0){
printf("\nLectura 2\n");
lectura();
m=fork();
if(m!=0){
printf("\nLectura 3\n");
lectura();
if(m!=0){
printf("\nLectura 4\n");
lectura();
m=fork();
if(m!=0){
printf("\nLectura 5\n");
lectura();
m=fork();
}
}
}
}
}
}
}
}
ESCUELA POLIT

ECNICA NACIONAL, FACULTAD DE INGENIER

IA DE SISTEMAS, MOLINA, DEBER NO. 3 3


}
}
sleep(30);
}
III. RESULTADO Y DISCUSI ON
Los mecanismos de comunicaci on interprocesos de forma
permanente son utilizados cuando se desea comunicar a varios
procesos y no se desea que el mensaje se pierda. En la Figura 1
se muestra los mecanismo interprocesos de forma permanente
y sus caractersticas. En la parte de Cola de mensajes se
puede ver las colas de mensajes existentes diferenciadas por
su identicador (msqid) y el n umero de mensajes que se
encuentran en la cola.
Figura 1. ejecuci on de comando ipcs desde la terminal.
En la Figura 2 se puede observar los resultados obtenidos
despu es de ejecutar el c odigo de creacion.c, grabacion.c y
lectura.c. Primero se debe de ejecutar creaci on.c para que se
pueda crear la cola de mensajes.
Figura 2. ejecuci on de creacion.c, grabacion.c y lectura.c.
En la Figura 3 y Figura 4 se puede observar los resultados
de la fase 1, los dos procesos comparten la misma cola uno
enva y el otro lee el mensaje.
Figura 3. ejecuci on de la fase 2
Figura 4. ejecuci on del comando pstree desde la terminal cuando fase2.c
est a en tiempo de ejecuci on
En la Figura 5 y Figura 6 se puede observar los resultados
de la fase 3, los cinco primeros procesos envan el mensaje a
los otros cinco procesos que los leer an.
IV. CONCLUSIONES
Este tipo de mecanismos es util y debe ser utilizado,
cuando se desea que el mensaje se mantenga en el
tiempo.
Se debe crear primero la cola de mensajes, ya que este
es el medio a trav es del cual se van a comunicar los
procesos.
Es importante que se creen nuevas variables de tipo msg
para la grabaci on de los mensajes en cada uno de los
programas, esto permite que los mensajes de creados con
un programa lleguen a otro.
ESCUELA POLIT

ECNICA NACIONAL, FACULTAD DE INGENIER

IA DE SISTEMAS, MOLINA, DEBER NO. 3 4


Figura 5. ejecuci on de la fase 3
V. REFERENCIAS
[2] W. Mauerer, Professional linux kernel architecture,
Wrox, 2009.
Figura 6. ejecuci on del comando pstree desde la terminal cuando fase3.c
est a en tiempo de ejecuci on

También podría gustarte