problema con fork

Iniciado por julio1, 20 Enero 2019, 16:59 PM

0 Miembros y 1 Visitante están viendo este tema.

julio1

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?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    printf("%d\n", getpid());
    int result = fork(), status;
    switch (result)
    {
    case -1:
        perror("fork");
        break;
    case 0:
        printf("proceso hijo: %d\n", getpid());
        break;
    default:
        printf("proceso padre: %d\n", getpid());
        break;
    }

    return 0;
}

La salida extraña es esta:

ivancea96

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

julio1

Gracias por la ayuda creo que el codigo final quedari así:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int main()
{
    printf("%d\n", getpid());
    int result = fork();
    switch (result)
    {
    case -1:
        perror("fork");
        break;
    case 0:
        printf("proceso hijo: %d\n", getpid());
        break;
    default:
        printf("proceso padre: %d\n", getpid());
        wait(NULL);

        break;
    }

    return 0;
}


julio1

#3
Publiqué este comentario sin querer, si alguien hace el favor de eliminarlo...