Estoy aprendiendo sobre los comandos fork () y exec (). Parece que fork () y exec () generalmente se llaman juntos. (fork () crea un nuevo proceso hijo, y exec () reemplaza la imagen del proceso actual por una nueva). Sin embargo, ¿en qué escenarios podría llamar a cada función por sí solo? ¿Hay escenarios como estos?
system-calls
exec
fork
quil
fuente
fuente

Respuestas:
¡Por supuesto! Un patrón común en los programas de "envoltura" es hacer varias cosas y luego reemplazarse por algún otro programa con solo una
execllamada (sin bifurcación)Un ejemplo real de esto es
GIT_SSH(aunquegit(1)también se ofreceGIT_SSH_COMMANDsi no desea hacer el método del programa contenedor anterior).Fork-only se usa cuando se generan un montón de procesos típicamente de trabajo (por ejemplo, Apache
httpden modo fork) (aunque fork-only se adapta mejor a los procesos que necesitan quemar la CPU y no a aquellos que hacen girar sus pulgares esperando que suceda la E / S de red) ) o para la separación de privilegios utilizada porsshdy otros programas en OpenBSD (sin ejecutivo)El
rootsshd tiene en la conexión del cliente una bifurcación de sí mismo (28571) y luego otra copia (14625) para la separación de privilegios.fuente
Hay bastantes.
Los programas que llaman
fork()sinexec(), generalmente siguen un patrón de generación de procesos de trabajo infantil para realizar diversas tareas en procesos separados al principal. Usted encontrará esto en programas tan variados comodhclient,php-fpm, yurxvtd.Un programa que llama
exec()sinfork()es la carga de la cadena , la superposición de su proceso de imagen un programa diferente con. Hay toda una subcultura de utilidades de carga en cadena que hacen cosas particulares para procesar el estado y luego ejecutan otro programa para ejecutar con ese estado de proceso revisado. Tales utilidades son comunes en la familia de servicios de daemontools y los conjuntos de herramientas de administración del sistema, pero no se limitan a ellos. Algunos ejemplos:chpstdel runit de Gerrit Papes6-softlimitys6-envdirdel s6 de Laurent Bercotlocal-reaperymove-to-control-groupde mi conjunto de herramientas noshrdprioyidprioen FreeBSDnumactlen FreeBSD y LinuxLos conjuntos de herramientas de la familia daemontools tienen muchas de estas herramientas, de
machineenvprincipiofind-matching-jvma finruntool.fuente
Además de otras respuestas, los depuradores, que usan
ptrace, generalmente hacen uso de la brecha entreforkyexec. Un depurador debe marcarsePTRACE_TRACEMEpara indicar que está siendo rastreado por su proceso padre: el depurador. Esto es para otorgar los permisos necesarios al depurador.Entonces, un depurador primero se bifurcaría. El niño llamaría
ptraceconPTRACE_TRACEMEy luego llamaríaexec. Cualquiera que sea el programa, el padre y la madre del niño podrán rastrearlo.fuente
ejecutivo sin tenedor
Hay al menos dos razones por las que querrías hacer algo así:
tenedor sin ejecutivo
Eso es lo que hace cada demonio cada vez que se inicia (dos veces, de hecho). Esto hace varias cosas, entre ellas el shell no se cuelga (ya que el proceso original en el que el shell espera termina) y el demonio ya no está controlado por el terminal, por lo que cerrar la ventana del shell no mata al demonio.
Otro uso común es bifurcar a los niños trabajadores, que se hizo famoso por el servidor web Apache hace unos 25 años (hoy en día esto ya no se considera de vanguardia debido a que es muy propenso al problema del rebaño atronador, pero ciertamente proporciona el El servidor más simple y robusto posible).
Sin embargo, otro uso común es crear una instantánea consistente.
forkno solo crea un proceso, también copia (en teoría, en realidad solo marca páginas copiadas en escritura) el espacio de direcciones. Esto (atómicamente) crea una instantánea de los datos completos del programa que el padre ya no puede modificar.Algunos programas se aprovechan de eso. Por ejemplo, redis guarda datos en el disco (en un estado coherente) y al mismo tiempo modifica el conjunto de datos simultáneamente. Esto solo funciona porque
forkcreó una instantánea consistente que no ve las modificaciones realizadas por el proceso padre.fuente