sistema que programacion procesos proceso llamada ejemplo devuelve comando arbol c linux fork

programacion - que devuelve fork



El comportamiento de la llamada al sistema fork() en Linux en este código (2)

Cuando llama a fork() el sistema operativo crea una copia de la memoria completa de los procesos actuales (en realidad no copia la memoria, ya que puede usar la MMU para hacerlo de manera eficiente).

Como la salida estándar está almacenada en búfer por defecto, solo imprimirá el mensaje una vez que se escriban los caracteres de nueva línea o se vacíe la secuencia. Cuando se bifurca un nuevo proceso, el búfer de escritura actual (que contiene "Prueba") también se duplicará en el nuevo proceso. Esto se imprimirá una vez que el proceso finalice, ya que esto cierra de forma implícita (y elimina) la salida estándar. Si reemplaza el printf("%s", "Test "); con printf("%s/n", "Test "); o agregar un fflush(stdout); Llame antes de la fork() verá la salida esperada.

Esta pregunta ya tiene una respuesta aquí:

He leído en libros y recursos en línea que la llamada al sistema fork () crea una copia del proceso actual y ambos procesos comienzan a ejecutarse desde el momento en que se realiza la llamada al sistema fork (). ¿Es correcto?

Si es correcto, ¿por qué el siguiente código imprime "Test Test"? Debe imprimir "Prueba" solo una vez (por el proceso principal).

#include <sys/types.h> /* pid_t */ #include <sys/wait.h> /* waitpid */ #include <stdio.h> /* printf, perror */ #include <stdlib.h> /* exit */ #include <unistd.h> /* _exit, fork */ int main(void) { int ctr =1; int pc = 1; printf("%s", "Test "); pid_t pidmain = fork(); return EXIT_SUCCESS; }


En el punto donde se llama a la bifurcación, ambos procesos tienen la cadena "Prueba" en sus búferes para la salida estándar. Cuando sale de cada proceso, ambos descargan este texto en la salida (consulte la explicación de la exit ). Podría (como se sugiere) agregar una nueva línea al búfer (y es setbuf salga debido al búfer). setbuf explicación de setbuf ). O puede llamar a fflush (stdout) antes de la bifurcación y obtener exactamente lo que solicitó: la cadena "Test".