TAREA 02:
"Ping gráfico con matlab"
Nombre: Cesar Vasquez I.
Rol: 9821040-7
Profesor: Agustin Gonzalez
Ayudante: Eduardo Gonzalez
INTRODUCCION:
En la presente tarea se
trabajará con tres conceptos vistos en clases:
- COMUNICACION ENTRE PROCESOS.
- CONTROL DE PROCESOS
- SEÑALES
Estos conceptos son sumamente importantes a la hora de programar a gran
escala dentro de un sistema, y nos abren una gran variedad de
posibilidades que en la primera tarea no poseíamos. Se
utilizaron los tres conceptos para lograr el objetivo de la tarea y,
como se mostrará a coninuación, gracias a ellos se pudo
conceguir el logro de cada uno de los requerimientos.
DESCRIPCIÓN DEL PROBLEMA:
El problema consistía en crear
una herramienta tipo ping grafico en donde se fuesen mostrando los
tiempos de respuesta de los paquetes, pero sin tener que reinventar una
aplicacion para envío y recepciñon de paquetes, ni tener
que realizar una aplicación que graficara.
Para ello, se pretende utilizar los conocimientos visto en clases sobre
manejo de procesos y valernos de aplicaciones ya existentes en la
actualidad.
SOLUCION PROPUESTA:
Control
de procesos:
La solucion propuesta, consiste en un
proceso padre que a su vez crea 2 procesos hijos, uno para manejar el
ping y otro para manejar el programa grafico, en nuestro caso, MATLAB.
Para ello se utilizó la función fork para poder crear
dichos hijos y obtener los pids respectivos.
Comunicacion entre Procesos:
Luego de haber creado los procesos, se
utilizaron pipas para obtener una comunicacion entre ellos. En conjunto
con las pipas propiamente tales, se utilizó el comando dup para
manejar los descriptores de archivos. Así, se podia asociar la
salida standar del comando ping a una pipa y poder leer los mensajes
que se pretendían imprimir en pantalla. Luego, se rescataba el
tiempo de respuesta de los paquetes por medio de funciones tribiales, y
se imprimía en matlab. Para ello se asociaba la entrada estandar
de matlab con el extremo de otra pipa y asi opder escribir
correctamente.
Señales
Finalmente, se utilizaran señales para manejar el termino
del programa y asi poder hacer limpieza antes de dar termino al
programa padre.
Se limpiarán los buffers, se espera por el termino de cada uno
de los procesos padre, se cierran los descriptores de archivo
utilizados, etc.
ARCHIVOS:
La tarea se compone de los siguientes
archivos:
- readme.txt: El archivo de ayuda que ud esta leyendo en estos
momentos.
- gping.c: Archivo con el codigo fuente de la tarea.
- Makefile: Archivo necesario para la compilacion de la tarea.
- documentacion.html: Archivo con la documentacion de alto nivel.
COMPILACIÓN:
Para compilar la tarea, debe ejecutar
el siguiente comando:
$ make
Este comando debe ser ejecutado en el mismo directorio en donde se
encuentran este y los demas archivos, y debe realizarse en una maquina
UNIX con matlab instalado. (de preferencia aragorn.elo.utfsm.cl)
EJECUCIÓN:
Para ejecutar la tarea se debe ejecutar:
$ ./gping <HOST>
En donde HOST es la dirección a la que se desea hacer ping.
Si la dirección es correcta, se abrirá una ventana con un
gráfico en
matlab en donde aparecerán los tiempos de retardo de los paquetes
junto con la FFT de dichos retardos.
Ademas, para terminar la ejecución del programa, solo debe
presionar
CTRL+C en la consola donde ejecutó el programa.
Para limpiar el directorio de los archivos no deseados (pseudo-fuente,
binarios, temporales, backups, etc) solo escriba en pantalla:
$ make clean.
PROBLEMAS Y SOLUCIONES:
A continuación se enumeran los
problemas que se tuvo en el desarrollo de la tarea y su solución:
- El principal problema fue el no tener muy claro como se manejaban
las pipas para poder escribir y leer en procesos distintos. En un
principio, no comprendía muy bien cual era la salida estandar y
la entrada estandar y los descriptores de archivos, pero una vez que el
profe aclaró de mejor manera todo eso, fue mucho mas
fácil.
- Otro problema fue el como sacar los tiempos de respuesta de los
paquetes, esto se logró con una mezcla de fgets en donde se leyó una
linea, almacenada en un buffer y luego fue procesada por la
función strtok.
- Finalmente, hubo que aprender a manejar las señales entre
procesos, para poder realizar un buen termino del programa via SIGINT y realizando la debida
limpieza antes del termino.