fork fork fork, 2ª parte

Creo que es un buen momento para exponer el codigo que prometi de como hacer una malla de procesos. El problema consiste en crear una malla o arbol de procesos de NxN teniendo en cuenta que los hijos siempre moriran antes que sus padres.

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
 int pid, i=1, j=1, aux, x, y, k, fila, columna;

 if(argc!=3) printf("Error en el numero de argumentos.\n");
 else
 {
  x=atoi(argv[1]);
  y=atoi(argv[2]);
  fila=0;
  columna=0;
  int hijos[y], primera_fila[x];

  for(i=0; i<x; i++)
  {
   pid=fork(); //primer fork
   primera_fila[i]=pid;
   if(pid==0) //codigo de los hijos del proceso malla
   {
    fila=i+1;
    columna=1;
    i=x+1; //hacemos que el proceso hijo salga del for a la fuerza
    hijos[0]=getpid();
   }
  }

  if(fila!=0 && columna!=0) //cuando no nos encontremos en el proceso malla
  {
   for(j=2; j<=y; j++) //fabricaremos con otro for el resto de hijos
   {
    pid=fork();
    if(pid==0) //en caso de ser un hijo
    {
     columna=j;
     hijos[j-1]=getpid();
    }
    else j=y+1; //si no es un hijo forzamos la salida
   }
  }

  if(fila==0 && columna==0) //en caso de ser la malla
  {
   printf("Soy el proceso malla: mi pid es %d\n", getpid());
   printf("Soy el proceso malla: mi pid es %d: mis hijos de la primera fila son:");
   for(i=0; i<x; i++)
   {
    if(i==x-1) printf(" %d\n", primera_fila[i]);
    else printf(" %d,",primera_fila[i]);
   }
   for(k=0; k<x; k++) wait(0); //esperara hasta que se muera el ultimo hijo
   printf("Soy malla (%d) y muero.\n", getpid());
  }
  else //si no estamos en la malla
  {
   printf("Soy el proceso %d%d: mi pid es %d. Mis padres son: ", fila, columna, getpid());
   for(i=columna-1; i>=0; i--)
   {
    if(i==0) printf(" %d\n", hijos[i]);
    else printf(" %d,",hijos[i]);
   }
   if(columna!=y) wait(0); //si no es el ultimo hijo dejamos al proceso en espera
   else sleep(20); //si es el ultimo hijo lo dormimos antes de que muera para poder ejecutar pstree -c -p -l o similar

   printf("Soy el %d%d (%d) y muero.\n", fila, columna, getpid());
   exit(0); //el hijo muere y despues su padre, y asi sucesivamente hasta que muera la malla
  }
 }
}

5 comentarios para “fork fork fork, 2ª parte”

  1. la secuencia de creacion de procesos es indeterminista, segun kurt.

  2. JaviUltros Dijo:

    He aquí la respuesta de por qué no puede haber más de 8 miembros en una familia de los Sims

  3. Joer, muchas gracias por el ejemplo.. aunque tanto el enunciado, como el dibujo me suenan extrañadamente a SO1 (no estarás estudiando en la UA verdad?).. Pero me viene de perlas para aprender esto ya que yo me estaba comiendo la cabeza en un doble bucle y claro, o se me creaban más hijos, o menos y era un rollo jeje :)

  4. Pues va a ser que si estoy estudiando en la UA y dando SO XD

  5. Por cierto, yo hay una cosa que cambiaría en tu programa para que quede más claro.
    Cuando sacas al padre del bucle, en vez de asignarle el valor máximo del bucle para que salga, también puedes hacer un “break” para que salga del bucle, y así, queda mucho más claro lo que hace :)

Leave a Reply