Wenn ich ein Programm mit gcc kompiliere und versuche, es über die Bash-Shell auszuführen, wie lautet die genaue Reihenfolge der Schritte, gefolgt von Bash, um es auszuführen?
Ich weiß fork()
, execve()
, loader
, dynamic linker
(und andere Dinge) beteiligt sind, aber kann jemand eine genaue Abfolge von Schritten und eine geeignete Lesereferenz geben?
Bearbeiten:
Aus den Antworten geht hervor, dass die Frage viele Möglichkeiten implizieren könnte. Ich möchte mich auf einen einfachen Fall beschränken:
(test.c druckt nur Hallo Welt)
$ gcc test.c -o test
$ ./test
Was sind die Schritte im obigen Fall ( ./test
), die sich speziell auf das Bash-Startprogramm in einem untergeordneten Prozess beziehen, das Laden, Verknüpfen usw.?
shell
process
executable
Jake
quelle
quelle
Antworten:
Nun, die genaue Reihenfolge kann variieren, da es möglicherweise einen Shell-Alias oder eine Shell-Funktion gibt, die zuerst erweitert / interpretiert wird, bevor das eigentliche Programm ausgeführt wird, und dann Unterschiede zwischen einem qualifizierten Dateinamen (
/usr/libexec/foo
) und etwas, das in allen Verzeichnissen gesucht wird derPATH
Umgebungsvariablen (nurfoo
). Auch können die Einzelheiten der Durchführung Sache noch komplizierter, dafoo | bar | zot
mehr Arbeit für die Shell erfordert ( eine bestimmte Anzahl vonfork(2)
,dup(2)
und, natürlich,pipe(2)
unter anderem Systemaufrufe), während wie etwasexec foo
ist viel weniger Arbeit als die Schale nur ersetzt selbst mit das neue Programm (dh es tut es nichtfork
). Wichtig sind auch Prozessgruppen (insbesondere die Vordergrundprozessgruppe, von der alle PIDs essenSIGINT
Wenn jemand anfängt, auf Ctrl+ zu pürieren C, werden Sitzungen und ob der Job im Hintergrund ausgeführt wird, überwacht (foo &
) oder im Hintergrund, ignoriert (foo & disown
). E / A-Umleitungsdetails ändern auch Dinge, z. B. wenn die Standardeingabe von der Shell (foo <&-
) geschlossen wird oder wenn eine Datei als stdin (foo < blah
) geöffnet wird .strace
oder ähnliches ist informativ über die spezifischen Systemaufrufe, die während dieses Prozesses ausgeführt werden, und es sollte Manpages für jeden dieser Aufrufe geben. Geeignetes Lesen auf Systemebene wäre eine beliebige Anzahl von Kapiteln aus Stevens '"Advanced Programming in the UNIX Environment", während ein Shell-Buch (z. B. "From Bash to Z Shell") die Shell-Seite der Dinge detaillierter behandelt.quelle
Angenommen, eine Lehrbuchbeispiel-Shell (aus Gründen der Codeklarheit) wird bereits ausgeführt (damit der dynamische Linker fertig ist). Für die von Ihnen erwähnten Befehle muss die Shell die folgenden Systemaufrufe ausführen:
Kompliziertere Befehle machen diese Grundsequenz natürlich komplizierter. Zwei einfachere Beispiele für grundlegende Komplikationen sind die grundlegende Umleitung, bei der eine offene, geschlossene Dup-Sequenz zwischen dem Fork und den Exec- und Hintergrundprozessen eingefügt wird, bei denen das Warten übersprungen wird (und ein weiteres Warten einem Sigchld-Handler hinzugefügt wird).
quelle
Ich empfehle, Abschnitt 8.4.6 mit fork zu lesen und auszuführen, um Programme auszuführen
auf http://www.groupes.polymtl.ca/inf2610/documentation/ComputerSystemBook.pdf
quelle