Bifurcaciones (forks)
Un mecanismo antiguo para crear procesos es la bifurcación.
Consiste en hacer una réplica exacta del proceso actual
con ayuda de la función fork(),
cuyo retorno permite discernir
entre el proceso original y su clon.
Sólo POSIX
Este mecanismo sólo está disponible en sistemas POSIX.
Creación
La función fork() se obtiene
desde el módulo os.
Esta función no requiere argumentos adicionales.
El proceso clon es distinguido del original en base al valor de retorno de la función, tal como se ve a continuación.
Retorno
El valor de retorno obtenido no es igual para el proceso original que para su clon, permitiendo diferenciarlos desde la rutina:
| retorno | significado |
|---|---|
retorno > 0 |
Proceso original - devuelve el ID del proceso clon |
retorno == 0 |
Es un clon del proceso original |
retorno < 0 |
Error de bifurcación - bifurcación fallida |
Estructura
La bifurcación no delimita las rutinas específicas del proceso original y de su clon en base a "tareas" o funciones sino que las delimita con el uso de saltos condicionales:
from os import fork
# bifurcacion
retorno = fork()
# proceso original:
if retorno > 0:
# Rutina del original
# proceso clon: retorno = 0
elif retorno == 0:
# Rutina del clon
# bifurcacion fallida
else:
# Rutina de error
Ejemplo de uso
Esta rutina sencilla crea un fork y muestra los PIDs que ve cada uno de los procesos resultantes:
from os import fork
# Rutina común
print("¡Vamos a hacer un fork de un proceso!")
# bifurcacion
retorno = fork()
# proceso original: retorno = ID proceso hijo
if retorno > 0:
pid = os.getpid()
print("Rutina del proceso original")
print(f"pid: {pid}, retorno: {retorno}")
# proceso clon: retorno = 0
elif retorno == 0:
pid = os.getpid()
print("Rutina del proceso hijo")
print(f"pid = {pid}, retorno: {retorno}")
# error : retorno < 0
else:
print("Error de bifurcación")
El reporte en la shell es algo parecido a esto: