Saltar al contenido

¿Quién ejecuta primero después de fork(): padre o hijo?

Haz todo lo posible por comprender el código bien previamente a adaptarlo a tu proyecto y si ttienes algo que aportar puedes dejarlo en la sección de comentarios.

Solución:

En general, no se puede decir nada sobre el orden relativo de su ejecución.

Ahora, consideremos su problema específico. Si:

  1. ambos procesos toman una cantidad de tiempo no trivial para ejecutarse, y
  2. estás diciendo que uno corre hasta el final antes de que el otro haga ninguna progreso, y
  3. hay ciclos de CPU sin usar, y
  4. esto sucede cada vez que ejecuta la aplicación.

Lo más probable es que esto indique que hay alguna sincronización (quizás no intencionada) entre los dos procesos.

En realidad, ese es el comportamiento previsto, incluso si actualmente no funciona como debería, lo que significa que el padre puede correr antes que el niño y el niño puede correr antes que el padre.

El objetivo es ejecutar primero el proceso hijo.

En resumen, la lógica detrás de esto es que si el niño se ejecuta primero, la sobrecarga de copia al escribir (COW) se elimina si el niño está llamando exec ya que el padre no tiene ninguna posibilidad de escribir en el espacio de direcciones.

Si está llamando a vfork, casi todas las implementaciones definen que el niño se ejecutará primero y luego el padre se ejecutará (hasta que el niño llame a exec). Entonces notará la ejecución en serie en el caso de vfork independientemente del horario. se crean dos nuevos procesos. Se pueden ejecutar de forma independiente (al igual que cualquier otro proceso). Qué proceso se ejecuta primero dependerá en gran medida del algoritmo de programación. Además del algoritmo de programación, la cantidad de procesos que se ejecutan en ese momento también determinará la naturaleza de la salida. Además, si está utilizando funciones de E / S de biblioteca estándar, generarán datos en ráfagas (probablemente no sea la palabra correcta). Eso también determinará hasta cierto punto quién escribe primero. Aquí hay un código de muestra (eso no tiene mucho sentido en la práctica, pero sigue siendo un buen ejemplo de que padre e hijo de hecho corren en sincronismo

  #include
  #include
  static void charAtTime(char buff[])

char *p=buff;
while(*p) 
putc(*p,stdout);
(p++);



    int main()

setbuf(stdout,NULL);   //set output stream to be unbuffered.Now each process will try to throw chars as soon as they are ready
int pid;
char buff[1000];
if((pid=fork())<0)   //First fork
    
    fprintf(stderr,"Fork errorn");
    
else if(pid==0)
    
    strcpy(buff,"i am the child.I love beyblade.I love anime.I love pokemonn");
   charAtTime(buff);    
  
   else 
     int pid2=fork();   //secnd fork
     if(pid2==0)
     strcpy(buff,"I am the younger childn");
         charAtTime(buff);
        
   else 
int pid3;
pid3=fork();    //third fork
if(pid3==0)
    
    strcpy(buff,"I am from the 2nd generationn");
    charAtTime(buff);
    
     else 
    strcpy(buff,"Our family tree is bit confusingn");
    charAtTime(buff);
    
        

     strcpy(buff,"I am the big daddy of them.I have the right before themn");
    

   return 0;
    

Para mi sistema viene el siguiente resultado

   i am thOeI u ra cmfha mtihley  yoIturne geea rmi  cshf irblodimt
   thceo i2nnlfdd .uIg elnseoivrnea gb
   teiyobnl
   ade.I love anime.I love pokemon   

Sin embargo, si reduce el número de bifurcaciones a dos (solo dos procesos compiten), la salida es menos fea. Es el padre el que se ejecuta primero. (Probablemente porque es el proceso en ejecución actual cuando se crea el otro proceso)

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *