Tarea Nº2 - Programación de sistemas

"Ping Gráfico usando Matlab"


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.