Entonces, cuando se dispara un comando desde un shell, fork () hereda un proceso secundario del mismo y exec () carga el proceso secundario en la memoria y se ejecuta.
No exactamente. fork()
clona el proceso actual, creando un hijo idéntico. exec()
carga un nuevo programa en el proceso actual, reemplazando el existente.
Mi qs es:
Si el proceso secundario contiene todos los atributos del proceso primario (que es el proceso original), ¿cuál es la necesidad de este proceso secundario? El proceso original también podría haberse cargado en la memoria.
La necesidad se debe a que el proceso padre aún no desea finalizar; quiere que se inicie un nuevo proceso y haga algo al mismo tiempo que continúa ejecutándose también.
¿Este concepto fork y exec se aplica a todos los programas ejecutables en UNIX? ¿Al igual que para el script de shell también o solo para los comandos? ¿También se aplica a los comandos integrados de shell?
Para los comandos externos, el shell hace un fork()
comando para que el comando se ejecute en un nuevo proceso. Las construcciones solo son ejecutadas por el shell directamente. Otro comando notable es exec
, que le dice al shell al exec()
programa externo sin primero fork()
ing. Esto significa que el propio shell se reemplaza con el nuevo programa y, por lo tanto, ya no está allí para que ese programa regrese cuando salga. Si usted dice, exec true
y luego /bin/true
va a reemplazar su cáscara, y de inmediato la salida, sin dejar nada que se ejecuta en su terminal más, así que se va a cerrar.
cuando se utiliza el concepto de copia en escritura si voy a ejecutar un comando / script?
De vuelta en la edad de piedra, fork()
de hecho tuvimos que copiar toda la memoria en el proceso de llamar al nuevo proceso. Copiar al escribir es una optimización en la que las tablas de páginas se configuran para que los dos procesos comiencen a compartir toda la misma memoria, y solo las páginas en las que cada proceso escribe se copian cuando sea necesario.