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
}
}
}
|


