Si je compile un programme à l'aide de gcc et essaie de l'exécuter à partir du shell bash, quelle est la séquence exacte des étapes suivies par bash pour l'exécuter?
Je sais fork()
, execve()
, loader
, dynamic linker
(et autres) sont impliqués, mais quelqu'un peut - il donner une suite exacte des étapes et une référence de lecture appropriée?
Éditer:
D'après les réponses, il semble que la question pourrait impliquer de nombreuses possibilités. Je veux me limiter à un cas simple:
(test.c imprime juste bonjour le monde)
$ gcc test.c -o test
$ ./test
Quelles seront les étapes dans le cas ci-dessus ( ./test
), concernant spécifiquement le démarrage du programme bash dans un processus enfant, le chargement, la liaison, etc.?
shell
process
executable
Jake
la source
la source
Réponses:
Eh bien, la séquence exacte peut varier, car il peut y avoir un alias ou une fonction shell qui soit d'abord développé / interprété avant l'exécution du programme réel, puis des différences pour un nom de fichier qualifié (
/usr/libexec/foo
) par rapport à quelque chose qui sera recherché dans tous les répertoires de laPATH
variable d'environnement (justefoo
). De plus, les détails de l'exécution peut compliquer les choses, commefoo | bar | zot
exige plus de travail pour la coquille ( un certain nombre defork(2)
,dup(2)
et, bien sûr,pipe(2)
entre autres appels système), alors que quelque chose commeexec foo
beaucoup moins de travail que la coque elle - même remplace simplement avec le nouveau programme (c'est-à-dire qu'il ne fonctionne pasfork
). Les groupes de processus sont également importants (en particulier le groupe de processus de premier plan, dont tous les PIDSIGINT
lorsque quelqu'un commence à écraser Ctrl+ C, les sessions et si le travail va être exécuté en arrière-plan, surveillé (foo &
) ou en arrière-plan, ignoré (foo & disown
). Les détails de la redirection d'E / S changeront également les choses, par exemple, si l'entrée standard est fermée par le shell (foo <&-
), ou si un fichier est ouvert en tant que stdin (foo < blah
).strace
ou similaire fournira des informations sur les appels système spécifiques effectués au cours de ce processus, et il devrait y avoir des pages de manuel pour chacun de ces appels. Une lecture appropriée au niveau du système serait un certain nombre de chapitres de la "Programmation avancée dans l'environnement UNIX" de Stevens, tandis qu'un livre shell (par exemple, "De Bash à Z Shell") couvrira le côté shell des choses plus en détail.la source
En supposant qu'un exemple de shell de manuel (pour la clarté du code) soit déjà en cours d'exécution (de sorte que l'éditeur de liens dynamique soit terminé), les commandes que vous mentionnez nécessiteront que le shell effectue les appels système suivants:
Des commandes plus compliquées ajoutent bien sûr plus de complication à cette séquence de base. Deux exemples plus simples de complications de base sont la redirection io de base où une séquence de dup ouverte, fermée et insérée est insérée entre le fork et les processus exec et d'arrière-plan où l'attente est ignorée (et une autre attente est ajoutée à un gestionnaire sigchld).
la source
Je suggère de lire la section 8.4.6 Utilisation de fork et execve pour exécuter des programmes
sur http://www.groupes.polymtl.ca/inf2610/documentation/ComputerSystemBook.pdf
la source