Proceso hijo múltiple

4 minutos de lectura

avatar de usuario
israkir

¿Alguien puede ayudarme sobre cómo crear múltiples procesos secundarios que tengan el mismo padre para hacer “alguna” parte de un trabajo en particular?

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.

EDITAR: Tal vez debería mencionar la bifurcación de múltiples procesos secundarios con bucle …

  • ¿No estarías mejor con hilos?

    – AviD

    18 de mayo de 2009 a las 7:41

  • bueno, eso puede ser correcto… pero necesito practicar la bifurcación múltiple (), lo que significa un proceso de múltiples hijos…

    – israkir

    18 de mayo de 2009 a las 7:46

Aquí se explica cómo bifurcar a 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.
}

  • Realmente no entendí la segunda parte (espere a que los niños salgan). ¿Qué significa el estado? ¿Es esa una propiedad de proceso hijo?

    – israkir

    18 de mayo de 2009 a las 15:03

  • El estado es el estado de salida del proceso secundario. Depende del valor de salida (…), o si una señal elimina el proceso, entonces depende del número de señal. Ver esto para más: linux.die.net/man/2/esperar

    – puntos

    20 de mayo de 2009 a las 0:12

  • una pregunta, ¿estás bifurcando del mismo padre raíz o de cada hijo?

    – Oh Chin Boon

    22 de mayo de 2011 a las 9:38

  • hola pts! Me preguntaba por qué los procesos de los niños no se bifurcan en un nuevo proceso. Acabo de notar la llamada para salir (0). Quiero preguntarle: si esa llamada no estuviera presente allí, los niños habrían llamado a fork() así como al proceso padre, ¿no es así? Quiero decir, el primer proceso hijo tendría i = 0 y llamaría a 10 bifurcaciones… Quiero decir, los hijos entrarían en el bucle for, ¿no?

    – volante88

    22 de junio de 2011 a las 3:33


  • @flyer88: Sí, lo harían.

    – puntos

    21 de diciembre de 2013 a las 1:01

Creo que valdría la pena señalar por qué los hilos son más apropiados aquí:

Como está tratando de hacer una “parte” del trabajo en paralelo, asumo que su programa necesita conocer el resultado del cálculo. Las bifurcaciones () de un proceso no comparten más que la información inicial después de la bifurcación (). Cada cambio en un proceso es desconocido para el otro y deberá 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 datos y hacer que sean visibles entre sí “inmediatamente”. Además de agregar los beneficios de ser más liviano, elegiría pthreads().

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

  • Por otro lado, si Ud. trabajo es proporcionado por el usuario, le gustaría hacerlo en un nuevo proceso para la protección contra fallas.

    – Alex Chambelán

    9 de enero de 2013 a las 19:41

avatar de usuario
Mateo Flaschen

Puedes hacer esto con tenedor. Un padre determinado puede bifurcar tantas veces como quiera. Sin embargo, estoy de acuerdo con AviD. subprocesos 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
}

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

    – CANISTA

    2 de octubre de 2015 a las 2:19

Si desea lanzar varias bifurcaciones, debe hacerlo de forma recursiva. 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);
        }
    }
}

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad