Pregunta

Necesitamos decir el resultado del siguiente programa C:

main()
{
    int pid, k, som;
    som = 0; k = 2;
    pid = fork();
    if(pid == 0)
        k=5;
    else
        wait(0);
    for(int i = 1; i <= k; i++)
        som += i;
    printf("%d", som);
}

Mi primera expectativa es 3. Cuando se realiza una llamada fork, se copia la memoria del proceso y ambos programas se ejecutan. El proceso hijo luego se ejecuta, pero k todavía es igual a 2. Entonces, al final, ejecuta 1 + 2 = 3;

Pero cuando se ejecuta este programa, genera 153. No tengo la pista más cercana de por qué genera eso.

¿Alguien puede decir por qué?

¿Fue útil?

Solución

El motivo es que tiene 2 procesos imprimiendo en la misma consola. " tenedor " es un comando unix / linux que se llama una vez y devuelve dos veces. Una de las devoluciones estará en el proceso original que se llamó fork y devolverá el PID del proceso hijo que se generó. El segundo retorno será 0 y esto indica que es el proceso hijo.

Uno de los programas, creo que el niño, se ejecuta primero y calcula 15 como el valor y luego lo imprime en la consola. El programa padre se ejecuta en segundo lugar debido a la espera (0) y produce el valor 3.

Otros consejos

15 se imprime por hijo y 3 por padre.

A es padre, B es hijo, aquí están las líneas importantes:

A: pid = fork(); // returns 0 for the child process
A: wait(0);
B: k = 5;
B: for(int i = 1; i <= k; i++) som += i; // som = 15
B: printf("%d", som); // prints 15, B finishes, goes back to A
A: for(int i = 1; i <= k; i++) som += i; // som = 3
A: printf("%d", som); // prints 3

No se imprime una nueva línea entre los valores, por lo que la respuesta del padre aparece justo después de la respuesta del niño.

Jared tiene razón sobre la causa de los valores.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top