Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: julio1 en 20 Enero 2019, 16:59 pm



Título: problema con fork
Publicado por: julio1 en 20 Enero 2019, 16:59 pm
Estoy usando fork en ubuntu, entiendo que el proceso padre es el proceso principal y que el proceso hijo es el secundario. Tengo un problema con este codigo, que muestra una salida extraña algunas veces, porque sucede esto?
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4.  
  5. int main()
  6. {
  7.    printf("%d\n", getpid());
  8.    int result = fork(), status;
  9.    switch (result)
  10.    {
  11.    case -1:
  12.        perror("fork");
  13.        break;
  14.    case 0:
  15.        printf("proceso hijo: %d\n", getpid());
  16.        break;
  17.    default:
  18.        printf("proceso padre: %d\n", getpid());
  19.        break;
  20.    }
  21.  
  22.    return 0;
  23. }
  24.  
La salida extraña es esta:(https://imageshack.com/a/img924/9597/uxGjON.png)


Título: Re: problema con fork
Publicado por: ivancea96 en 20 Enero 2019, 17:31 pm
Lo que estás viendo probablemente sea que el proceso padre ha terminado (ha llegado al return), pero el proceso hijo aun no ha mostrado por pantalla su linea.

Cuando el proceso padre termina, la consola lo detecta, y te vuelve a mostrar la línea para escribir comandos.
Luego, el proceso hijo muestra por consola su mensaje.

Al trabajar con procesos, es importante controlar el orden en el que terminan los hilos. Rara vez querrás que el proceso padre termine antes que los procesos hijos, con lo cual habría que esperar en el proceso padre a que los hijos terminen.

Para ello, entre las varias opciones que hay: http://man7.org/linux/man-pages/man2/wait.2.html (http://man7.org/linux/man-pages/man2/wait.2.html)


Título: Re: problema con fork
Publicado por: julio1 en 20 Enero 2019, 21:23 pm
Gracias por la ayuda creo que el codigo final quedari así:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/wait.h>
  5.  
  6. int main()
  7. {
  8.    printf("%d\n", getpid());
  9.    int result = fork();
  10.    switch (result)
  11.    {
  12.    case -1:
  13.        perror("fork");
  14.        break;
  15.    case 0:
  16.        printf("proceso hijo: %d\n", getpid());
  17.        break;
  18.    default:
  19.        printf("proceso padre: %d\n", getpid());
  20.        wait(NULL);
  21.  
  22.        break;
  23.    }
  24.  
  25.    return 0;
  26. }


Título: Re: problema con fork
Publicado por: julio1 en 20 Enero 2019, 21:25 pm
Publiqué este comentario sin querer, si alguien hace el favor de eliminarlo...