jueves, 24 de noviembre de 2011

Práctica 2

Estudia el siguiente codigo y escribe la jerarquia de procesos resultante. Despues, compila y ejecuta el codigo para comprobarlo (deberas añadir llamadas al sistema getpid, getppid y wait para conseguirlo).

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#define L1 2
#define L2 3
int main ()
{
int cont1, cont2;
pid_t pid;
for (cont2= 0; cont2< L2; cont2++)
{
for (cont1= 0; cont1< L1; cont1++)
{
pid= fork();
if (pid== 0)
break;
}
if (pid!= 0) break;
}
printf ("Soy el hijo: %d y Mi padre es: %d.\n", getpid(), getppid()); //Llamadas al sistema getpid, getppid
if (pid!= 0)
for (cont1= 0; cont1< L1; cont1++)
printf ("Fin del proceso%d.\n", wait (NULL)); //Llamada al sistema de wait
return 0;
}

Resultado de la ejecución del código anterior.

El arbol de jerarquia queda de la siguiente manera.




miércoles, 23 de noviembre de 2011

Actividad 1

Dibuja la jerarquía de procesos que resulta de la ejecución del siguiente código. Introduce las llamadas al sistema wait para que una vez generado el árbol de procesos los hijos sean esperados por sus respectivos padres. Ademas,  haz que se informe de los tiempos de ejecución de las aplicaciones  xload y kcalc que se generen así como del tiempo total de ejecución. Para calcular el  tiempo transcurrido, puedes utilizar la función time() de la librería estándar  time.h. La llamada time(NULL) devuelve los segundos transcurridos desde las 00:00:00 del 1/1/1970 hasta el instante de la llamada.

Código que crea la jerarquia de procesos

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main (int argc, char *argv[])
{
         int i, j;
         pid_t pid, nuevo, nuevo1;
         time_t ini, fin;
         ini= time(NULL);
         for (i= 0; i< 2; i++)
         {
                   pid= getpid();
                   for (j= 0; j< i+2; j++)
                   {
                            nuevo= fork();
                            if(nuevo== 0)
                            {
                                      break;
                                      nuevo1= fork();
                                      if(nuevo1== 0)
                                               execlp ("xload", "xload", NULL);
                            }
                   }
                   if (pid!= getpid())
                            execlp ("kcalc", "kcalc", NULL);
         }
         for (i= 0; i< 2; i++)
         for (j= 0; j< i+2; j++)
         {
                   wait(NULL);
         }
         printf ("Tiempo total: %ld\n", time(NULL)-ini);
         printf("Soy el hijo : %d y Mi padre es : %d\n",getpid(),getppid());
         sleep(3);
         return 0;
}

Del código anterior el resultado de su ejecucuión fue:... En sus primera ejecución...


Segunda ejecución...



Y el arbol de jerarquias de procesos de la primera ejecucion queda así: