2009-09-04 38 views
6

¿Cómo se usa el comando fork() de modo que se pueden generar 10 procesos y hacer que hagan una pequeña tarea al mismo tiempo?Múltiple tenedor() Concurrencia

Concurrente es la palabra operativa, muchos lugares que muestran cómo usar la horquilla solo usan una llamada a fork() en sus demostraciones. Pensé que usarías algún tipo de bucle pero lo intenté y parece en mis pruebas que los tenedores() están generando un nuevo proceso, haciendo un trabajo, y luego generando un nuevo proceso. Entonces parece que se ejecutan de forma secuencial, pero ¿cómo puedo hacer un fork al mismo tiempo y hacer que 10 procesos hagan el trabajo simultáneamente si eso tiene sentido?

Gracias.

Actualización: Gracias por las respuestas chicos, creo que acabo entendido bien algunos aspectos de tenedor() al principio, pero lo entiendo ahora. Aclamaciones.

+2

BTW-- ¿Usted realmente * * desea procesos (como en el texto) o hilos (como en la etiqueta). Si procesa la etiqueta que desea es [multiprocesamiento] – dmckee

+0

sí, está correcto –

Respuesta

15

llamada fork() en un bucle:

código Agregando a esperar a los niños por los comentarios:

int numberOfChildren = 10; 
pid_t *childPids = NULL; 
pid_t p; 

/* Allocate array of child PIDs: error handling omitted for brevity */ 
childPids = malloc(numberOfChildren * sizeof(pid_t)); 

/* Start up children */ 
for (int ii = 0; ii < numberOfChildren; ++ii) { 
    if ((p = fork()) == 0) { 
     // Child process: do your work here 
     exit(0); 
    } 
    else { 
     childPids[ii] = p; 
    } 
} 

/* Wait for children to exit */ 
int stillWaiting; 
do { 
    stillWaiting = 0; 
    for (int ii = 0; ii < numberOfChildren; ++ii) { 
     if (childPids[ii] > 0) { 
      if (waitpid(childPids[ii], NULL, WNOHANG) != 0) { 
      /* Child is done */ 
      childPids[ii] = 0; 
      } 
      else { 
      /* Still waiting on this child */ 
      stillWaiting = 1; 
      } 
     } 
     /* Give up timeslice and prevent hard loop: this may not work on all flavors of Unix */ 
     sleep(0); 
    } 
} while (stillWaiting); 

/* Cleanup */ 
free(childPids); 
+1

Escribiría 'break -> exit' –

+2

oh definitivamente. Estás invitando a una bomba tenedor limitada de lo contrario. –

+0

Gracias por detectar eso. He actualizado –

3

Solo haz un ciclo en el proceso "principal" generando un hijo después de otro y cada uno asigna una tarea en particular.

4

Cuando finaliza los procesos, WILL se ejecutará al mismo tiempo. Pero tenga en cuenta que a menos que tenga suficientes procesadores inactivos disponibles, es posible que en realidad no se ejecuten al mismo tiempo, lo que en realidad no debería importar ...

Su segundo párrafo hace que parezca que no entiende cómo funciona el tenedor, tiene para verificar el código de retorno para ver si está en el padre o en el proceso bifurcado. Por lo tanto, haría que el padre ejecutara un ciclo para dividir 10 procesos, y en los hijos hará lo que quiera hacer al mismo tiempo.