• Domingo 28 de Abril de 2024, 18:32

Autor Tema:  Problemilla Con Fork()  (Leído 694 veces)

espartako84

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Problemilla Con Fork()
« en: Lunes 26 de Noviembre de 2007, 18:53 »
0
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:

Código: Text
  1. #include<stdio.h>
  2.  
  3. int h;
  4.  
  5.  
  6. void hijos2 (int Nv2, int Nh2){
  7.   switch (fork()) {
  8.     case -1:
  9.       printf("Error\n");
  10.       break;
  11.     case 0:
  12.       printf("Es el hijo numero %d cuyo padre es %d, HIJOS2 coordendas %d, %d\n", getpid(), getppid(),Nv2, Nh2);
  13.     //  fflush(stdout);
  14.       break;
  15.     default:
  16.       if ((Nh2-h) > 0)
  17.       hijos2(Nv2, Nh2-h);
  18.       break;
  19.   }
  20.   return;
  21. }
  22.  
  23. void hijos (int Nv, int Nh) {
  24.   switch (fork()) {
  25.     case -1:
  26.       printf("Error\n");
  27.       break;
  28.     case 0:
  29.       printf("Es el hijo numero %d cuyo padre es %d. HIJOS, coordenadas %d, %d\n", getpid(), getppid(), Nv, Nh);
  30.     //fflush(stdout);
  31.       break;
  32.     default:
  33.       if ((Nh-h) > 0)
  34.         hijos2(Nv,Nh-h);
  35.       if ((Nv-h) > 0)
  36.         hijos(Nv-h, Nh);
  37.       break;
  38.       }
  39. return;
  40. }
  41.  
  42.  
  43. main (){
  44.   int cas, temp;
  45. printf("Introduzca el numero de casillas, y el divisor: \n");
  46. scanf("%d%d", &cas, &h);
  47.  
  48. hijos(cas, cas);
  49.  
  50. }
  51.  

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:
Código: Text
  1. Introduzca el numero de casillas, y el divisor:
  2. 4 2
  3. Es el hijo numero 25520 cuyo padre es 25519. HIJOS, coordenadas 4, 4
  4. Es el hijo numero 25521 cuyo padre es 25519, HIJOS2 coordendas 4, 2
  5. Es el hijo numero 25524 cuyo padre es 25519. HIJOS, coordenadas 2, 4
  6. Es el hijo numero 25525 cuyo padre es 25519, HIJOS2 coordendas 2, 2
  7.  
  8.  

Pero en realidad resulta:
Código: Text
  1. Introduzca el numero de casillas, y el divisor:
  2. 4 2
  3. Es el hijo numero 25520 cuyo padre es 25519. HIJOS, coordenadas 4, 4
  4. Es el hijo numero 25521 cuyo padre es 25519, HIJOS2 coordendas 4, 2
  5. Es el hijo numero 25522 cuyo padre es 25521. HIJOS, coordenadas 2, 4
  6. Es el hijo numero 25523 cuyo padre es 25521, HIJOS2 coordendas 2, 2
  7. Es el hijo numero 25524 cuyo padre es 25519. HIJOS, coordenadas 2, 4
  8. Es el hijo numero 25525 cuyo padre es 25519, HIJOS2 coordendas 2, 2
  9.  
  10.  

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

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

Código: Text
  1. ...
  2. default:
  3.     //  if ((Nh-h) > 0)
  4.     //    hijos2(Nv,Nh-h);
  5.       if ((Nv-h) > 0)
  6.         hijos(Nv-h, Nh);
  7.       break;
  8. ...
  9.  

o

Código: Text
  1. ...
  2. default:
  3.       if ((Nh-h) > 0)
  4.         hijos2(Nv,Nh-h);
  5.     //  if ((Nv-h) > 0)
  6.     //    hijos(Nv-h, Nh);
  7.       break;
  8. ...
  9.  

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  :comp: