2009-05-18 19 views
13

¿alguien me puede ayudar a crear múltiples procesos secundarios que tienen el mismo padre para hacer "alguna" parte de un trabajo en particular?Proceso hijo múltiple

por ejemplo, un algoritmo de clasificación externo que se aplica con procesos secundarios; cada proceso hijo ordena una parte de los datos y, finalmente, el padre los fusiona ..

EDIT: Tal vez debería mencionar los múltiples procesos que se bifurcan niño con lazo ..

+0

¿No estaría mejor con los hilos? – AviD

+0

bien, eso puede ser correcto ... pero necesito practicar el bifurcación múltiple() que significa proceso secundario múltiple ... – israkir

Respuesta

3

Usted puede hacer esto con fork. Un padre dado puede bifurcar tantas veces como quiera. Sin embargo, estoy de acuerdo con AviD pthreads puede ser más apropiado.

pid_t firstChild, secondChild; 
firstChild = fork(); 
if(firstChild > 0) 
{ 
    // In parent 
    secondChild = fork(); 
    if(secondChild > 0) 
    { 
    // In parent 
    } 
    else if(secondChild < 0) 
    { 
    // Error 
    } 
    else 
    { 
    // In secondChild 
    } 
} 
else if(firstChild < 0) 
{ 
    // Error 
} 
else 
{ 
    // In firstChild 
} 
+0

¿no deberíamos también considerar el caso, donde xxxChild <0 generará un error? Creo que (xxxChild> 0) será más apropiado ... – CHANist

+0

@CHANist, gracias, debería estar cubierto ahora. –

38

Aquí es cómo horquilla 10 niños y esperar a que terminen:

pid_t pids[10]; 
int i; 
int n = 10; 

/* Start children. */ 
for (i = 0; i < n; ++i) { 
    if ((pids[i] = fork()) < 0) { 
    perror("fork"); 
    abort(); 
    } else if (pids[i] == 0) { 
    DoWorkInChild(); 
    exit(0); 
    } 
} 

/* Wait for children to exit. */ 
int status; 
pid_t pid; 
while (n > 0) { 
    pid = wait(&status); 
    printf("Child with PID %ld exited with status 0x%x.\n", (long)pid, status); 
    --n; // TODO(pts): Remove pid from the pids array. 
} 
+1

realmente no obtuve la segunda parte (esperar a que los niños salgan) ... ¿qué significa el estado? ¿Es esa una propiedad del proceso hijo? – israkir

+0

El estado es el estado de salida del proceso hijo. Depende del valor de salida (...), o si el proceso es cancelado por una señal, entonces depende del número de señal. Consulte esto para obtener más información: http://linux.die.net/man/2/wait – pts

+0

una pregunta, ¿está bifurcando desde el mismo padre raíz o desde cada hijo? –

5

creo que valdría la pena señalar qué temas son más apropiadas aquí:

Como usted tratando de hacer una "parte" del trabajo en paralelo supongo que su programa necesita saber sobre el resultado del cálculo. fork() s de un proceso no comparten más información que la inicial después de fork(). Cada cambio en un proceso es desconocido para el otro y usted necesitaría pasar la información como un mensaje (por ejemplo, a través de una tubería, consulte "man pipe"). Los subprocesos en un proceso comparten el mismo espacio de direcciones y, por lo tanto, pueden manipular los datos y hacerlos visibles entre sí "inmediatamente". Además de agregar los beneficios de ser más liviano, iría con pthreads().

Después de todo: Aprenderá todo lo que necesita saber sobre fork() si utiliza pthreads de todos modos.

+0

Por otro lado, si * work * es proporcionado por el usuario, querrá hacerlo en un nuevo proceso para la protección contra fallas. –

1

Si desea iniciar varias horquillas, debe hacerlo recursivamente. Esto se debe a que debe llamar a fork desde el proceso principal. De lo contrario, si lanza una segunda bifurcación, duplicará el proceso principal y el primer hijo. Aquí hay un ejemplo:

void forker(int nprocesses) 
{ 
    pid_t pid; 

    if(nprocesses > 0) 
    { 
     if ((pid = fork()) < 0) 
     { 
      perror("fork"); 
     } 
     else if (pid == 0) 
     { 
      //Child stuff here 
      printf("Child %d end\n", nprocesses); 
     } 
     else if(pid > 0) 
     { 
      //parent 
      forker(nprocesses - 1); 
     } 
    } 
} 
Cuestiones relacionadas