¿Por qué a veces fork devuelve padre y otras veces hijo?

¿Por qué a veces fork devuelve padre y otras veces hijo?

Al ejecutar la forkllamada para crear un nuevo proceso, si tiene éxito, devuelve 0(el hijo) o el padre.

No entendí la idea detrás de esto. ¿Por qué no forksiempre regresa childo siempre parent?

Respuesta1

Cuando usted fork(), el código que se está ejecutando se encuentra ejecutándose en dos procesos (suponiendo que la bifurcación sea exitosa): un proceso es el padre y el otro el hijo. fork()devuelve 0 en el proceso hijo y el pid hijo en el proceso padre: es completamente determinista.

Así es como puedes determinar, después de fork(), si estás ejecutando el sistema principal o secundario. (Y también cómo el padre conoce el pid del niño: debe esperarlo en algún momento).

Con un poco más de detalle:

  • las futuras llamadas al proceso padre fork();
  • el núcleo crea un nuevo proceso, que es el hijo, y configura varias cosas apropiadamente, pero ambos procesos se están ejecutandoel mismo codigoy están "esperando" un retorno de la misma función;
  • ambos procesos continúan ejecutándose(no necesariamente de inmediato, y no necesariamente simultáneamente, pero eso no viene al caso):
    • fork()devuelve 0 al proceso hijo, que continúa y utiliza esa información para determinar que es el hijo;
    • fork()devuelve el pid secundario al proceso principal, que continúa y utiliza esa información para determinar que es el padre.

Respuesta2

La fork()llamada al sistema "regresa dos veces", siempre (a menos que falle). En el padre, devuelve el PID del proceso hijo y en el hijo, devuelve cero.

El flujo habitual es

pid_t pid;
int status;

pid = fork();

if (pid == 0) {
  run_child_stuff();
  exit(0);
} else if (pid > 0) {
  run_parent_stuff();
  wait(&status); /* wait for child to exit */
} else {
  /* handle failure to fork */
}

... o similar.

información relacionada