Estoy tratando de aprender programación UNIX y encontré una pregunta con respecto a fork (). Entiendo que fork () crea un proceso idéntico al proceso actualmente en ejecución, pero ¿dónde comienza? Por ejemplo, si tengo código
int main (int argc, char **argv)
{
int retval;
printf ("This is most definitely the parent process\n");
fflush (stdout);
retval = fork ();
printf ("Which process printed this?\n");
return (EXIT_SUCCESS);
}
El resultado es:
Este es definitivamente el proceso principal
¿Qué proceso imprimió esto?
¿Qué proceso imprimió esto?
Pensé que eso fork()
crea un mismo proceso, así que inicialmente que en ese programa, la fork()
llamada se llamaría recursivamente para siempre. ¿Supongo que el nuevo proceso creado desde fork()
comienza después de la fork()
llamada?
Si agrego el siguiente código, para diferenciar entre un proceso primario y secundario,
if (child_pid = fork ()) printf ("This is the parent, child pid is %d\n", child_pid);
else printf ("This is the child, pid is %d\n",getpid ());
después de la llamada fork (), ¿dónde comienza su ejecución el proceso hijo?
man fork
es suficiente para responder a su pregunta, por ciertoRespuestas:
El nuevo proceso se creará dentro de la
fork()
llamada, y comenzará regresando al igual que el padre. El valor de retorno (desde el que almacenóretval
)fork()
será:Su código de prueba funciona correctamente; almacena el valor de retorno desde
fork()
adentrochild_pid
y lo usaif
para verificar si es 0 o no (aunque no busca un error)fuente
Sí. Numeremos las líneas:
El flujo de ejecución es:
... que explica exactamente la salida que recibió.
Si desea saber cómo el programa original y el bifurcado pueden comportarse de manera diferente, ya que necesariamente comparten el mismo código, vea la respuesta de Michael Mrozek.
fuente
La verdadera solución a esto es
fuente
cualquiera que sea el código justo después del
fork()
, se copia en el proceso secundario, y no mezcle el proceso primario y secundario, son dos entidades diferentes, que tienen el mismo entorno (duplicado, no compartido).Ahora vea su salida ...
fuente