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

268
Vistas
¿Dónde comienza a ejecutarse el proceso después de fork()?
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> int main(void) { for (int i = 1; i < 4; i++) { printf("%d", i); int id = fork(); if (id == 0) { printf("Hello\n"); exit(0); } else { exit(0); } } return 0; }

Para este código, imprime 11Hello en mi computadora. Me parece contrario a la intuición porque "1" se imprime dos veces, pero es antes de que se llame a fork().

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

0

La llamada al sistema fork() bifurca un nuevo proceso y ejecuta la instrucción que le sigue en cada proceso de forma paralela. Después de que su proceso secundario imprima el valor de i en la salida estándar, se almacena en el búfer, lo que luego imprime el valor de 'i' nuevamente porque la salida estándar no se vació.

Utilice la fflush(stdout); para que 'i' se imprima solo una vez por bifurcación.

Alternativamente, también podría usar printf("%d\n", i); donde el carácter de nueva línea al final hace el trabajo.

over 4 years ago · Santiago Trujillo Denunciar

0

Para empezar, el for loop es superfluo en su ejemplo.

Recuerde que el niño copia la memoria de la persona que llama (la de su padre) (código, globales, montón y pila), registros y archivos abiertos. Para ser eficaz o puede haber alguna otra razón, es posible que la llamada printf no vacíe el búfer y coloque las cosas pasadas, excepto en algunos casos, como agregar un terminador de nueva línea.

Antes de la bifurcación, el padre (proceso principal) está en camino.

Supongamos que estamos en un sistema de un solo núcleo y el niño primero se adelanta al núcleo.

1 está en el búfer porque su padre lo puso en él antes de bifurcarlo. Luego, el niño llega a la segunda declaración de impresión, una advertencia aquí es que el niño puede quedar huérfano en ese momento (no importa en este momento), pasando la cadena "Hello\n" que incluye el carácter de nueva línea que da lugar a volcar el búfer/caché (lo que sea que llame). Como ve el carácter \n , vacía el búfer, incluido el 1 anterior agregado por su padre, que es 11Hello .

Supongamos que el padre se adelanta al núcleo al principio,

Se rinde después de llamar a la declaración de exit , lo que hace que el niño quede huérfano y provoca una pérdida de memoria. Después de ese punto, el jefe ( init que posee la identificación del proceso como 1 ) cuyo nuevo nombre no recuerdo (puede ser sys-algo) debe manejar este caso. Sin embargo, nada cambia en cuanto a los pasos de impresión. Entonces te encuentras nuevamente con 11Hello excepto que si no, el búfer se vacía automáticamente.

No tengo mucha experiencia laboral con ellos, pero la clase universitaria (fallé en el curso 4 veces). Sin embargo, puedo aconsejarle siempre que sea posible que use stderr mientras hace frente a estos problemas, ya que no está almacenado en búfer, en lugar de stdout o hay alguna forma mágica (lo olvidé nuevamente, lo llama al principio en main() ) puede opte por deshabilitar el almacenamiento en búfer para stdout también.

Para ser más competente sobre estos temas, debe echar un vistazo a La interfaz de programación de Linux de Michael Kerrisk y los temas relacionados con William Pursell , Jonathan Leffler , WhozCraig , John Bollinger y Nominal Animal . He aprendido una gran cantidad de información de ellos, incluso si la información es casi totalmente inútil en las fronteras de Turquía.

*Magia significa necesitar muchos detalles para explicar.

over 4 years ago · Santiago Trujillo Denunciar

0

¿Dónde comienza a ejecutarse el proceso después de fork()?

fork() duplica la imagen del proceso y su contexto. Ejecutará la siguiente línea de código señalada por el puntero de instrucción.


Me parece contrario a la intuición porque "1" se imprime dos veces, pero es antes de que se llame a fork().

Lea la anomalía de printf después de "fork ()"

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