Autor Tema: Duda al crear procesos en paralelo en c lenguajeC fork y wait  (Leído 4350 veces)

gatoher

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 86
    • Ver Perfil
Pues me gustaría saber si alguien me puede explicar una parte de un método que no llego a entender. La verdad que en C no estoy muy puesto. Mejor comento lo que comprendo y me explicais la parte que tengo en duda. Pongo el método:

Código: [Seleccionar]

//HIJOS PARALELOS
void ejemplo2(){
    NUM_HIJOS = 3; // ejemplo
    int ret, i;
 
for (i=0; i<NUM_HIJOS; i++) {
ret = fork(); //Aqui generamos un nuevo proceso
if (ret == 0) {
/* estamos en alguno de los hijos. */
printf("Yo soy el hijo %d, mi padre es PID= %d, yo soy PID= %d\n", i,getppid(), getpid());

                      //Este exit solo acaba el proceso en ejecución
                      //ya que el bucle si hace 3 ciclos
exit(EXIT_SUCCESS);
               
              //Solo si hay un error al crear el proceso
} else if (ret == -1) {
perror("fallo en fork");
exit(EXIT_FAILURE);
}
       //fin for
}

        //aqui llega despues de crear el proceso hijo por la linea de antes de
        //exit(EXIT_SUCCESS);
ret = wait(NULL); // ¿¿¿ ret vale -1 ????

       //A partir de aqui no lo entiendo
      //A mi forma de ver aqui nunca entraría
while (ret > 0) {
ret = wait(NULL);
}
/*Esto tampoco lo entiendo*/
if (ret == -1 && errno != ECHILD) {
perror("fallo en wait");
exit(EXIT_FAILURE);
}
}   

   No se si me expliado, la verdad.
« Última modificación: 31 de Diciembre 2016, 16:51 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Re:Duda al crear procesos en paralelo en c lenguajeC fork y wait
« Respuesta #1 en: 31 de Diciembre 2016, 16:51 »
Buenas, la verdad es que esto corresponde a programación bastante avanzada (que no se suele usar excepto para cuestiones singulares)

Aquí hay un ejemplo que quizás ayude a entender fork y wait aunque solo lo recomiendo para expertos:

Código: [Seleccionar]

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

int main(void)
{
    pid_t child_pid, wpid;
    int status = 0;
    int i;
    int a[3] = {1, 2, 1};

    printf("parent_pid = %d\n", getpid());
    for (i = 0; i < 3; i++)
    {
        printf("i = %d\n", i);
        if ((child_pid = fork()) == 0)
        {
            printf("In child process (pid = %d)\n", getpid());
            if (a[i] < 2)
            {
                printf("Should be accept\n");
                exit(1);
            }
            else
            {
                printf("Should be reject\n");
                exit(0);
            }
            /*NOTREACHED*/
        }
    }

    while ((wpid = wait(&status)) > 0)
    {
        printf("Exit status of %d was %d (%s)\n", (int)wpid, status,
               (status > 0) ? "accept" : "reject");
    }
    return 0;
}

Ejemplo de posible resultado:

parent_pid = 15820
i = 0
i = 1
In child process (pid = 15821)
Should be accept
i = 2
In child process (pid = 15822)
Should be reject
In child process (pid = 15823)
Should be accept
Exit status of 15823 was 256 (accept)
Exit status of 15822 was 0 (reject)
Exit status of 15821 was 256 (accept)

Salu2

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".