Tema: Concurrencia
Ver Mensaje Individual
  #4 (permalink)  
Antiguo 18/04/2016, 11:15
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 9 meses
Puntos: 204
Respuesta: Concurrencia

Código C:
Ver original
  1. for(i=0;i<2;i++)
  2.   fork();

Pregunta: ¿Cuántos hilos habrá al terminar ese bucle?

Respuesta: 4

Explicación:
  • En la primera iteración tendremos dos, el padre (P) y un hijo (H1)
  • En la segunda iteración tendremos 4 ( P crea 1 y H1 crea otro)
Luego tu intento de crear únicamente N hijos no funciona porque estás creando un número de hijos desproporcionado.

Por otro lado, llamar a fork hace que el hijo tenga una copia de la memoria del padre y a partir de ese momento cada uno usa su propia memoria... almacenar en un arreglo los id no parece una buena idea porque cada proceso va a almacenar un arreglo diferente.

Si el número de hijos es una constante puedes probar algo tal que:

Código C:
Ver original
  1. if( fork() )
  2.   if( fork() )
  3.     if( fork() )
  4.       return; // Aqui solo llega el padre
  5.  
  6. funcion(); // Los 3 hijos ejecutan esto

También puedes embeber el código en un bucle... pero teniendo cuidado de crear procesos únicamente desde el padre:

Código C:
Ver original
  1. #define HIJOS 3
  2. int main()
  3. {
  4.   int padre = getpid();
  5.  
  6.   for( int i=0;i<HIJOS;i++)
  7.     if( !fork() ) break;
  8.  
  9.   if( getppid() == padre ) // Si el padre del proceso actual es el proceso principal estamos tratando con un hijo
  10.     printf("1");
  11. }

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.

Última edición por eferion; 18/04/2016 a las 11:25