Foros aprenderaprogramar.com

Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: gatoher en 19 de Diciembre 2016, 20:50

Título: Duda al crear procesos en paralelo en c lenguajeC fork y wait
Publicado por: gatoher en 19 de Diciembre 2016, 20:50
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.
Título: Re:Duda al crear procesos en paralelo en c lenguajeC fork y wait
Publicado por: Ogramar 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