Si compilo un programa usando gcc e intento ejecutarlo desde el shell bash, ¿cuál es la secuencia exacta de pasos seguidos por bash para ejecutarlo?
Sé que fork()
, execve()
, loader
, dynamic linker
(y otras cosas) están involucrados, pero puede alguien dar una secuencia exacta de pasos y alguna referencia de lectura adecuado?
Editar:
De las respuestas, parece que la pregunta podría implicar muchas posibilidades. Quiero limitarme a un caso simple:
(test.c solo imprime hello world)
$ gcc test.c -o test
$ ./test
¿Cuáles serán los pasos en el caso anterior ( ./test
), específicamente relacionados con el programa de inicio bash en algún proceso secundario, cargando, vinculando, etc.?
shell
process
executable
Jake
fuente
fuente
Respuestas:
Bueno, la secuencia exacta puede variar, ya que puede haber un alias o función de shell que primero se expande / interpreta antes de que se ejecute el programa real, y luego las diferencias para un nombre de archivo calificado (
/usr/libexec/foo
) frente a algo que se buscará en todos los directorios de laPATH
variable de entorno (solofoo
). Además, los detalles de la ejecución pueden complicar las cosas, ya quefoo | bar | zot
requiere más trabajo para el shell (cierto número defork(2)
,dup(2)
y, por supuestopipe(2)
, entre otras llamadas al sistema), mientras que algo asíexec foo
es mucho menos trabajo ya que el shell simplemente se reemplaza con el nuevo programa (es decir, no lo hacefork
). También son importantes los grupos de procesos (especialmente el grupo de procesos en primer plano, todos los PID que comenSIGINT
cuando alguien comienza a mezclar en Ctrl+ C, sesiones, y si el trabajo se ejecutará en segundo plano, monitoreado (foo &
) o en segundo plano, ignorado (foo & disown
). Los detalles de redirección de E / S también cambiarán las cosas, por ejemplo, si el shell (foo <&-
) cierra la entrada estándar o si un archivo se abre como stdin (foo < blah
).strace
o similar será informativo sobre las llamadas específicas del sistema realizadas a lo largo de este proceso, y debe haber páginas de manual para cada una de esas llamadas. La lectura adecuada a nivel de sistema sería cualquier número de capítulos de "Programación avanzada en el entorno UNIX" de Stevens, mientras que un libro de shell (por ejemplo, "De Bash a Z Shell") cubrirá el lado de shell de las cosas con más detalle.fuente
Suponiendo un shell de ejemplo de libro de texto (para mayor claridad del código) que ya se está ejecutando (por lo que se hace el enlazador dinámico), los comandos que menciona requerirán que el shell realice las siguientes llamadas al sistema:
Los comandos más complicados, por supuesto, agregan más complicaciones a esta secuencia básica. Dos ejemplos más simples de complicaciones básicas son la redirección io básica en la que se inserta una secuencia abierta, cerrada y duplicada entre la bifurcación y el exec y procesos en segundo plano donde se omite la espera (y se agrega otra espera a un controlador sigchld).
fuente
Sugiero leer la Sección 8.4.6 Usar fork y execve para ejecutar programas
en http://www.groupes.polymtl.ca/inf2610/documentation/ComputerSystemBook.pdf
fuente