Ich lerne etwas über die Befehle fork () und exec (). Es scheint, als würden fork () und exec () normalerweise zusammen aufgerufen. (fork () erstellt einen neuen untergeordneten Prozess und exec () ersetzt das aktuelle Prozessabbild durch ein neues.) In welchen Szenarien können Sie jedoch jede Funktion für sich aufrufen? Gibt es solche Szenarien?
system-calls
exec
fork
quil
quelle
quelle
Antworten:
Sicher! Ein übliches Muster in "Wrapper" -Programmen besteht darin, verschiedene Dinge zu tun und sich dann durch ein anderes Programm zu ersetzen, das nur einen
exec
Aufruf enthält (keine Gabelung).Ein reales Beispiel hierfür ist
GIT_SSH
(git(1)
bietet jedoch auch,GIT_SSH_COMMAND
wenn Sie die oben beschriebene Wrapper-Programmmethode nicht ausführen möchten).Fork-only wird verwendet, wenn eine Reihe von typischen Worker-Prozessen erzeugt werden (z. B. Apache
httpd
im Fork-Modus (obwohl Fork-only besser für Prozesse geeignet ist, die die CPU verbrennen müssen, und nicht für Prozesse, die mit den Daumen drehen und auf Netzwerk-E / A warten). ) oder zur Privilegientrennung, die vonsshd
und anderen Programmen unter OpenBSD verwendet wird (keine Ausführung)Der
root
sshd hat auf der Clientverbindung eine Kopie von sich selbst (28571) und dann eine weitere Kopie (14625) für die Privilegientrennung abgezweigt.quelle
Es gibt viele.
Programme, die
fork()
ohne aufrufen,exec()
folgen normalerweise einem Muster von Laichprozessen für untergeordnete Mitarbeiter, um verschiedene Aufgaben in separaten Prozessen zum Hauptprozess auszuführen. Sie finden diese in den Programmen finden wie variiertdhclient
,php-fpm
undurxvtd
.Ein Programm , das Anruf
exec()
ohnefork()
ist Kettenbelastung , seinen Prozess mit einem anderen Programmbild überlagert. Es gibt eine ganze Subkultur von Dienstprogrammen zum Laden von Ketten, die bestimmte Aktionen ausführen, um den Status zu verarbeiten und dann ein anderes Programm auszuführen, das mit diesem überarbeiteten Prozessstatus ausgeführt wird. Solche Dienstprogramme sind in der daemontools-Familie von Service- und Systemverwaltungs-Toolsets üblich, aber nicht auf diese beschränkt. Einige Beispiele:chpst
von Gerrit Papes Runits6-softlimit
unds6-envdir
aus Laurent Bercots s6local-reaper
undmove-to-control-group
aus meinem nosh toolsetrdprio
undidprio
auf FreeBSDnumactl
unter FreeBSD und LinuxDie Toolsets der Daemontools-Familie verfügen über viele solcher Tools, von
machineenv
bisfind-matching-jvm
bisruntool
.quelle
Zusätzlich zu anderen Antworten nutzen Debugger, die verwenden
ptrace
, normalerweise die Lücke zwischenfork
undexec
. Ein Debugger sollte sich mit markieren,PTRACE_TRACEME
um anzuzeigen, dass er von seinem übergeordneten Prozess - dem Debugger - verfolgt wird. Dies dient dazu, dem Debugger die erforderlichen Berechtigungen zu erteilen.Ein Debugger würde sich also zuerst selbst teilen. Das Kind würde rufen Sie
ptrace
mitPTRACE_TRACEME
und rufen Sie dannexec
. Welches Programm auch immer die untergeordneten Execs ausführen, sie können jetzt vom übergeordneten Programm nachverfolgt werden.quelle
Exec ohne Gabel
Es gibt mindestens zwei Gründe, warum Sie so etwas tun möchten:
Gabel ohne Exec
Das macht jeder Daemon jedes Mal, wenn er gestartet wird (tatsächlich zweimal). Dies führt verschiedene Aktionen aus, darunter, dass die Shell nicht hängt (da der ursprüngliche Prozess, auf den die Shell wartet, beendet wird) und der Dämon nicht mehr vom Terminal gesteuert wird, sodass das Schließen des Shell-Fensters den Dämon nicht beendet.
Eine andere häufige Verwendung ist das Gabeln von Arbeiterkindern, das vor etwa 25 Jahren durch den Apache-Webserver berühmt wurde (heutzutage wird dies nicht mehr als Stand der Technik angesehen, da es sehr anfällig für das Problem der donnernden Herde ist, aber es bietet sicher das verdammt einfachster, robustester Server möglich).
Eine weitere häufige Verwendung besteht darin, einen konsistenten Schnappschuss zu erstellen.
fork
erstellt nicht nur einen Prozess, sondern kopiert auch den Adressraum (theoretisch markiert er nur Seiten, die beim Schreiben kopiert werden). Dadurch wird (atomar) eine Momentaufnahme der gesamten Programmdaten erstellt, die das übergeordnete Element nicht mehr ändern kann.Einige Programme nutzen dies aus. Zum Beispiel speichert redis Daten auf der Festplatte (in einem konsistenten Zustand) und ändert gleichzeitig den Datensatz. Dies funktioniert nur, weil
fork
ein konsistenter Snapshot erstellt wurde, in dem die vom übergeordneten Prozess vorgenommenen Änderungen nicht angezeigt werden.quelle