Problema con fork()

espartkao84
26 de Noviembre del 2007
Saludos.

tengo que crear un codigo, que cree procesos pesados (por esto he supuesto que se utiliza el fork, en vez de hilos, no?), de manera recurrente, que coexistan entre si, y sean todos hijos del mismo padre.

La intención es que dada un tamaño de una matriz cuadrada, NxN, y un divisor exacto de N, llamado h, divida la matriz, en submatrices, de tamaño hxh.
Habia pensado la siguiente estructura:

[CODE]#include<stdio.h>

int h;


void hijos2 (int Nv2, int Nh2){
switch (fork()) {
case -1:
printf("Errorn");
break;
case 0:
printf("Es el hijo numero %d cuyo padre es %d, HIJOS2 coordendas %d, %dn", getpid(), getppid(),Nv2, Nh2);
// fflush(stdout);
break;
default:
if ((Nh2-h) > 0)
hijos2(Nv2, Nh2-h);
break;
}
return;
}

void hijos (int Nv, int Nh) {
switch (fork()) {
case -1:
printf("Errorn");
break;
case 0:
printf("Es el hijo numero %d cuyo padre es %d. HIJOS, coordenadas %d, %dn", getpid(), getppid(), Nv, Nh);
//fflush(stdout);
break;
default:
if ((Nh-h) > 0)
hijos2(Nv,Nh-h);
if ((Nv-h) > 0)
hijos(Nv-h, Nh);
break;
}
return;
}


main (){
int cas, temp;
printf("Introduzca el numero de casillas, y el divisor: n");
scanf("%d%d", &cas, &h);

hijos(cas, cas);

}[/CODE]

Tecnicamente la funcion hijos, crea los procesos para analizar las submatrices de la columna Nh, e hijos 2 crea los proceos para analizar la columna.

La salida deberia ser:
[CODE]Introduzca el numero de casillas, y el divisor:
4 2
Es el hijo numero 25520 cuyo padre es 25519. HIJOS, coordenadas 4, 4
Es el hijo numero 25521 cuyo padre es 25519, HIJOS2 coordendas 4, 2
Es el hijo numero 25524 cuyo padre es 25519. HIJOS, coordenadas 2, 4
Es el hijo numero 25525 cuyo padre es 25519, HIJOS2 coordendas 2, 2
[/CODE]

Pero en realidad resulta:
[CODE]Introduzca el numero de casillas, y el divisor:
4 2
Es el hijo numero 25520 cuyo padre es 25519. HIJOS, coordenadas 4, 4
Es el hijo numero 25521 cuyo padre es 25519, HIJOS2 coordendas 4, 2
Es el hijo numero 25522 cuyo padre es 25521. HIJOS, coordenadas 2, 4
Es el hijo numero 25523 cuyo padre es 25521, HIJOS2 coordendas 2, 2
Es el hijo numero 25524 cuyo padre es 25519. HIJOS, coordenadas 2, 4
Es el hijo numero 25525 cuyo padre es 25519, HIJOS2 coordendas 2, 2
[/CODE]

El hijo 25521 le da por reproducirse, y crea 2 vastagos :unsure:

Y tecnicamente las 2 funciones funcionan bien, ya que si eliminamos

[CODE]...
default:
// if ((Nh-h) > 0)
// hijos2(Nv,Nh-h);
if ((Nv-h) > 0)
hijos(Nv-h, Nh);
break;
...[/CODE]

o

[CODE]...
default:
if ((Nh-h) > 0)
hijos2(Nv,Nh-h);
// if ((Nv-h) > 0)
// hijos(Nv-h, Nh);
break;
...[/CODE]

en la funcion hijos, crea perfectamente los subprocesos para la linea o la columna primera de la matriz. No se donde esta el problema, y ya llevo 2 dias dandole vueltas al problema. Os adjunto el archivo con el programa.

Muchas gracias por la antención.

PD: Valla tocho que os he soltado, cuando me lio a escribir