Sé que puede ser cualquiera de estos. Pero siempre veo que el niño se ejecuta primero en mi terminal UNIX. Además, ¿por qué el padre y el hijo no se ejecutan en paralelo? Parecen estar ejecutándose en serie. ¿Esto es porque comparten el mismo terminal?¿Quién se ejecuta primero después de fork(): padre o hijo?
Respuesta
En general, nada se puede decir sobre el orden relativo de su ejecución.
Ahora, consideremos su problema específico. Si:
- ambos procesos tienen una cantidad no trivial de tiempo para correr, y
- que está diciendo que uno ejecuta hasta el final antes de que las otras marcas ningún progreso, y
- existen sin usar Ciclo de CPU, y
- esto ocurre cada vez que ejecuta la aplicación.
Lo más probable es que esto indique que hay una sincronización (tal vez no intencionada) entre los dos procesos.
+1.Depende del programador subyacente decidir cómo programar los diversos hilos. – Vicky
@aix: Ambos progresan. Estoy haciendo una impresión simple tanto en padres como en hijos. Nunca veo sus printfs intercalados. Es siempre printf infantil (~ 100 agrupados juntos) ... printfs padres (agrupados juntos) ... printfs infantiles .. – Bruce
@Bruce: ¿Estás seguro de que esto no se debe a la salida de almacenamiento en búfer (estás escribiendo en la terminal o a un archivo/tubería)? Además, 'top' debería darle una idea de si los dos procesos se están ejecutando" en paralelo ". – NPE
No hay realmente una ejecutándose antes que la otra. Es simplemente que el padre va a fork()
y luego wait()
para que el niño lo complete. Incluso puede bifurcarse varias veces si utiliza una serie de comandos canalizados, por ejemplo.
En realidad, ese es el comportamiento previsto, incluso si no está funcionando como debería, lo que significa que el padre puede ejecutar antes de que el niño y el niño puedan ejecutarse antes que el padre.
El objetivo es ejecutar primero el proceso secundario.
En resumen, la lógica detrás de esto es que si el hijo se ejecuta primero, la sobrecarga de copy on write (COW) se elimina si el hijo llama al exec
ya que el padre no tiene ninguna posibilidad de escribir en la dirección espacio.
Si está llamando a vfork, casi todas las implementaciones definen que el hijo se ejecutará primero y luego se ejecutará el padre. (Hasta las llamadas secundarias ejecutivas) .Así verá la ejecución en serie en el caso de vfork independientemente de schedular.Sin embargo, cuando fork se llama simplemente dos nuevos procesos creados. Pueden ejecutarse de forma independiente (como cualquier otro proceso). El proceso que se ejecuta primero dependerá en gran medida del algoritmo de programación. Además del algoritmo de programación, el número de procesos que se ejecutan en ese momento también determinará la naturaleza de la salida. Además, si está utilizando las funciones de E/S estándar de la biblioteca, generan datos en ráfagas (probablemente no la palabra correcta). Eso también determinará en cierta medida quién escribe primero. Aquí es un ejemplo de código (Eso no tiene mucho sentido prácticamente pero sigue siendo un buen ejemplo de que padre e hijo en verdad funcionan en sincronismo
#include<stdio.h>
#include<string.h>
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 error\n");
}
else if(pid==0)
{
strcpy(buff,"i am the child.I love beyblade.I love anime.I love pokemon\n");
charAtTime(buff);
}
else {
int pid2=fork(); //secnd fork
if(pid2==0){
strcpy(buff,"I am the younger child\n");
charAtTime(buff);
}
else {
int pid3;
pid3=fork(); //third fork
if(pid3==0)
{
strcpy(buff,"I am from the 2nd generation\n");
charAtTime(buff);
}
else {
strcpy(buff,"Our family tree is bit confusing\n");
charAtTime(buff);
}
}
strcpy(buff,"I am the big daddy of them.I have the right before them\n");
}
return 0;
}
Para mi sistema la siguiente salida se
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 horquillas a dos (solo dos procesos compiten), la salida es menos fea. Su padre se ejecuta primero. (Probablemente porque su proceso actual se ejecuta cuando se crea el otro proceso)
- 1. Android: el hijo especificado ya tiene un padre. Debe llamar a removeView() en el padre del hijo primero
- 2. Convierta las coordenadas entre UIView padre/hijo después de CGAffineTransform
- 3. Navegación padre-hijo-padre JAXB/XJC
- 4. El hijo especificado ya tiene un padre. Debe llamar a removeView() en el padre del hijo primero
- 5. carriles - relaciones padre/hijo
- 6. de CSS, padre e hijo
- 7. Constructor de bases en C# - ¿A quién se llama primero?
- 8. Enfoque estándar para determinar el éxito o el fracaso de fork/exec (mientras el padre se está ejecutando simultáneamente)?
- 9. Llamada al sistema Unix fork() ¿qué se ejecuta cuando?
- 10. Asp.Net Mvc - ¿se ejecuta onactionexecuted antes o después de ActionResult.Execute?
- 11. obtener parent.location.url - iframe - de hijo a padre
- 12. WebApi con código EF Primero genera un error al tener la relación padre-hijo
- 13. ¿Alguien puede explicar una descripción simple con respecto al 'descriptor de archivo' después de fork()?
- 14. Después de la bifurcación, ¿los procesos padre e hijo comparten el descriptor de archivo creado por canalización?
- 15. java.lang.IllegalStateException: el hijo especificado ya tiene un padre. Debe llamar RemoveView() en el padre del niño primero
- 16. Relación autorreferencial/padre-hijo en Entity Framework
- 17. proceso de parentalización: controlar quién es el nuevo padre
- 18. jQuery: seleccione la clase padre por hijo?
- 19. ¿Cómo ordeno por padre y luego hijo?
- 20. fork() procesos secundarios y secundarios
- 21. Cómo manejar errores execvp (...) después de fork()?
- 22. ¿Cómo diseñar DB con relaciones padre-hijo?
- 23. padre-hijo en la misma mesa
- 24. ¿Se crean automáticamente procesos secundarios con fork() cuando se mata al padre?
- 25. perl fork no funciona correctamente cuando se ejecuta de forma remota (a través de ssh)
- 26. ¿Cuál se ejecuta primero? Evento Form_Load o la inicialización de los componentes? (Forma de ventanas C#)
- 27. JavaScript se ejecuta después de google analytics
- 28. OO Pregunta de diseño - Padre/Hijo (s) - ¿Circular?
- 29. PCA primero o normalización primero?
- 30. Representación de relaciones padre-hijo en listas de SharePoint
posible duplicado de [ Puede el orden de ejecución de la horquilla() se determinará?] (http://stackoverflow.com/questions/6696959/can-the-order-of-execution-of-fork-be-determined) – Lekensteyn