33 votos

¿Por qué las conchas de la llamada fork()?

Cuando se inicia un proceso de una concha, ¿por qué la concha de la horquilla de sí mismo antes de ejecutar el proceso?

Por ejemplo, cuando el usuario introduce grep blabla foo, ¿por qué no puede el shell simplemente llame a exec() sobre grep sin un niño shell?

También, cuando un proyectil horquillas de sí mismo dentro de una interfaz gráfica de usuario emulador de terminal, hace que se inicie otro emulador de terminal? (como pts/13 inicio pts/14)

35voto

dextervip Puntos 146

Cuando se llama a un exec método de familia de no crear un nuevo proceso, en lugar de exec reemplaza el actual proceso de la memoria y del conjunto de instrucciones, etc, con el proceso que se desea ejecutar.

Como un ejemplo, si desea ejecutar grep el uso de exec. bash es un proceso (que se ha separado de la memoria, el espacio de direcciones). Ahora, cuando usted llame a exec(grep), exec reemplazará el actual proceso de la memoria, el espacio de direcciones, conjunto de instrucciones, etc, con grep's de datos. Que significa bash proceso dejará de existir. Como resultado, usted no puede volver a la terminal después de completar el grep comando. Por eso exec familia de métodos nunca se devuelve. No se puede ejecutar el código después de exec; es inalcanzable.

3voto

zacharyalexstern Puntos 149

Como por la pts, compruébelo usted mismo: en una shell, ejecute

echo $$ 

para conocer su identificador del proceso (PID), por ejemplo, he

echo $$
29296

A continuación, ejecute por ejemplo sleep 60 y luego, en otro terminal

(0)samsung-romano:~% ps -edao pid,ppid,tty,command | grep 29296 | grep -v grep
29296  2343 pts/11   zsh
29499 29296 pts/11   sleep 60

Así que no, en general tiene el mismo tty asociados al proceso. (Tenga en cuenta que esta es su sleep porque tiene su concha como la de los padres).

0voto

FlowRaja Puntos 11

Para cada comando ( ejemplo: grep) que se ejecuta en el prompt de bash, realmente la intención de iniciar un nuevo proceso y, a continuación, volver al prompt de bash después de la ejecución.

Si el proceso de shell ( bash) llamadas exec() para ejecutar grep, el proceso de shell será reemplazado con grep. Grep funcionará bien, pero después de la ejecución, el control no puede volver a la shell porque bash proceso ya está reemplazado.

Por esta razón, bash llamadas fork(), que no sustituye el proceso actual.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: