15 nov 2013

OS: Forks (C Boys)

Hoy hablaremos de las llamadas al sistema que todos hemos utilizado en el lenguaje de programación C. Anteriormente hemos hablado de bash, el scripting que nos ayuda en tareas cotidianas de administración y del cual un administrador debe manejar. Hoy vamos a un proceso más ingenieril, y quizá para muchos desconocido. Las llamadas al sistema son una enlace con la parte más cercana al kernel por parte del programador, por lo que un error en estos códigos podrían proporcionar acceso a información interesante. Pero hoy no es día de hacking, hoy es día de resolución de problemas, como solemos hacer en esta sección.

Problema tipo:

Siempre que entro en mi sesi ́on en las X me gusta ejecutar una serie de programas, y tenerlos siempre funcionando y a la vista, por si necesito trabajar con ellos. Ir arrancando todos ellos, uno a uno, ya es suficientemente pesado; si además tengo que arrancar alguno de ellos otra vez si por alguna razón se muere, la tarea se vuelve tediosa. En esta práctica te pedimos que crees un programa en el lenguaje C sobre Linux que me ayude en esa tarea. Debe hacer lo siguiente:

Al principio, tiene que crear 5 hijos.

Cada uno de esos cinco hijos debe ejecutar un programa diferente. Estos programas y sus argumentos serán los siguientes (sin las comillas):

• ”xload”• ”xeyes”• ”xlogo”• ”xcalc”• ”xclock update 1”

Durante toda su ejecución monitorizará a sus hijos. Si por alguna razón uno de ellos muere debe volver a crearlo y hacer que ejecute el mismo programa que estaba ejecutando anteriormente. De esta manera siempre debemos tener los mismo 5 programas ejecut ́andose simult ́aneamente.

Pistas: Las llamadas al sistema y funciones de librería necesarias para realizar esta práctica son fork(), wait(), exec().

Solución propuesta:

En primer lugar debemos crearnos una estructura que almacena el PID del proceso que el padre ejecutará (en este caso se lanzarán 5 procesos hijos), la ruta donde se encuentra el binario y el nombre del ejecutable. Se declarará un array de 5 posiciones, 1 posición por cada proceso. Tras llevar a cabo la inicialización de los valores (rutas y binarios), el proceso padre procede a realizar la creación de procesos hijos con la instrucción fork(). La ejecución de esta llamada al sistema devolverá 0 en el caso del proceso hijo y mayor que 0 si seguimos en el código del padre, por lo que en el caso de los hijos se deberá ejecutar su binario correspondiente apoyándonos en la variable i, para el acceso a la información en el array.

El padre quedará a la espera de la ejecución de sus hijos. En el caso de que alguno de los hijos muera se detectará gracias a la llamada al sistema wait(&estado). Se detecta el PID del proceso muerto y se vuelve a lanzar almacenando en la posición del array que sea el nuevo PID. De este modo el padre controla que sus hijos nunca mueran, ya que rápidamente se vuelven a levantar.

Esperamos que os haya gustado el problema presentado hoy, y como siempre estamos abiertos a ver vuestras soluciones. Sabemos de algún profesor de que se empieza a quedar sin problemas que presentar a sus alumnos :P

4 comentarios:

  1. Interesante artículo al igual que los anteriores dedicados a bash.Tengo una pregunta: ¿por qué pones el código como capturas y no como texto?

    ResponderEliminar
  2. Si hablais tambien de pipe() y como pasar valores entre procesos antes del jueves, a lo mejor me salvais el pellejo jaja

    ResponderEliminar
  3. jajajaja, imagino que tendrás un examen o algo así... Universidad? Teníamos pensado que fuera el viernes... y si justo pipes... Si nos contestas, negociamos! ;)Un saludo!

    ResponderEliminar
  4. Lastima lo vi tarde :(Mañana tengo que entregar una practica jaja al final ya lo entendi, aunque me queda retocar el codigo.Aun asi estare alerta del RSS el viernes :)Gracias!

    ResponderEliminar