Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

179
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!