Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

177
Vistas
printf() y fork() producen menos salida de lo esperado

Estoy aprendiendo sobre procesos de bifurcación y administración de memoria y me he encontrado con este código:

 #include <stdio.h> #include <libc.h> int main() { for (int i = 0; i < 3; ++i) { printf("*"); fflush(stdout); fork(); } return 0; }

Según mis cálculos, debería producir 7 estrellas: el proceso inicial imprime una estrella (1 estrella), se bifurca, ahora tenemos 2 procesos, cada uno de ellos imprime una estrella (1 + 2 = 3), luego se bifurcan, por lo que tenemos 4 procesos , cada uno de ellos imprime una estrella y luego muere cuando finaliza el programa.

Por lo tanto, deberíamos obtener 1 + 2 + 4 = 7 estrellas.

Sin embargo, durante algunas ejecuciones solo obtengo 6 estrellas, como en la siguiente captura de pantalla:

ingrese la descripción de la imagen aquí

Otras veces, cuando ejecuto el programa, todo está bien y obtengo 7 estrellas como esperaba.

Hasta ahora he buscado en Internet y no he encontrado nada parecido. La depuración tampoco ayudó.

Entonces, ¿qué puede causar este comportamiento extraño y cómo puedo solucionarlo?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Al ejecutar este código desde una terminal, notará que su * faltante en algunas ejecuciones no falta en absoluto, sino que se imprime después de que finaliza su programa.

Para una mejor comprensión, puede imprimir los PID en lugar de estrellas y una línea adicional cuando el proceso esté a punto de finalizar:

 int main() { for (int i = 0; i < 3; ++i) { printf("pid %d\n", getpid()); fflush(stdout); fork(); } printf ("pid %d terminates\n", getpid()); return 0; }

El resultado de una ejecución con impresiones faltantes se verá así, lo que indica que el terminal ya se devolvió antes de que todos los procesos hayan terminado:

 pid 31241 pid 31241 pid 31241 pid 31242 pid 31241 terminates pid 31243 pid 31244 terminates pid 31242 pid 31245 pid 31242 terminates pid 31246 terminates pid 31247 terminates pid 31245 terminates user@machine:~/bla$ pid 31243 terminates pid 31248 terminates

Para solucionar esto, puede dejar que el proceso principal espere sus procesos secundarios antes de regresar; esto hará que su proceso inicial finalice en último lugar y evitará que la terminal regrese cuando todavía hay procesos secundarios ejecutándose en segundo plano:

 while (wait(NULL) > 0); printf ("pid %d terminates\n", getpid());
over 4 years ago · Santiago Trujillo Denunciar

0

Sin embargo, durante algunas carreras solo obtengo 6 estrellas,...
Otras veces, cuando ejecuto el programa, todo está bien y obtengo 7 estrellas como esperaba.

No tiene control en qué orden las instancias imprimen las estrellas. Un ejemplo de write() (llamado implícitamente por fflush() ), fork() y exit() implícito al final del programa podría ser:

 instance 1: write() -> First star instance 1: fork() -> New instance #2 instance 1: write() -> Second star instance 2: write -> Third star instance 2: fork() -> New instance #3 instance 1: fork() -> New instance #4 instance 1: write() -> Fourth star instance 2: write() -> Fifth star instance 2: exit() instance 1: exit() -> Process #1 has finished ---- Process #1 does no longer exist --- instance 3: write() -> Sixth star instance 3: exit() instance 4: write() -> Seventh star instance 4: exit()

En el ejemplo, la sexta y la séptima estrella se imprimen, pero DESPUÉS de que haya finalizado el primer proceso.

Sin embargo, la salida de los programas se escribe en alguna "tubería" o "terminal virtual" y su editor de texto o IDE copia esa salida en la pantalla.

Tan pronto como finaliza el proceso "inicial" (instancia n.º 1), su IDE cree que su programa ha terminado y deja de copiar los datos en la pantalla, por lo que la sexta y la séptima estrella del ejemplo están escritas por su programa, pero no son copiados a la pantalla por el IDE.

cada uno de ellos imprime una estrella y luego muere cuando finaliza el programa.

... primero, las 4 instancias se bifurcan y luego las 8 instancias terminan.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda