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
exec
llamada (sin bifurcación)Un ejemplo real de esto es
GIT_SSH
(aunquegit(1)
también se ofreceGIT_SSH_COMMAND
si 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
httpd
en 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 porsshd
y otros programas en OpenBSD (sin ejecutivo)El
root
sshd 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:chpst
del runit de Gerrit Papes6-softlimit
ys6-envdir
del s6 de Laurent Bercotlocal-reaper
ymove-to-control-group
de mi conjunto de herramientas noshrdprio
yidprio
en FreeBSDnumactl
en FreeBSD y LinuxLos conjuntos de herramientas de la familia daemontools tienen muchas de estas herramientas, de
machineenv
principiofind-matching-jvm
a finruntool
.fuente
Además de otras respuestas, los depuradores, que usan
ptrace
, generalmente hacen uso de la brecha entrefork
yexec
. Un depurador debe marcarsePTRACE_TRACEME
para 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
ptrace
conPTRACE_TRACEME
y 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.
fork
no 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
fork
creó una instantánea consistente que no ve las modificaciones realizadas por el proceso padre.fuente