Wie erstelle ich einen Fork-Prozess, der nicht beendet wird, wenn die Shell beendet wird?spricht über „Double Forking“:
Doppelt-
fork()
:(emacs &)
Befehle in Klammern
(
)
werden in einem separaten Shell-Prozess ausgeführt.
Können Sie erklären, warum das im Vergleich zu einem einfachen einen Unterschied machen würde emacs &
? Welchen Sinn hätte es überhaupt, es in einer Subshell-Umgebung auszuführen?
Antwort1
Können Sie erklären, warum das im Vergleich zu einem einfachen einen Unterschied machen sollte
emacs &
?
(emacs &)
führt eine Untershell aus, die dann emacs &
in ihr ausgeführt wird, was bedeutet, dass ihre stdin
, stdout
, und stderr
stattdessen an die Untershell gebunden sind. Sie wird doppelt gegabelt und überlebt (emacs &)
das Sterben der ursprünglichen Shell (auf der sie ausgeführt wurde). Wenn sie nur ausgeführt wird, emacs &
bleiben die stdin
, stdout
, und stderr
an die ursprüngliche Shell gebunden.
emacs
ist eigentlich ein schlechtes Beispiel dafür, weil die GUI-Version sich nicht darum kümmert, dass stdin
, stdout
, und verloren gegangen sind stderr
. Sie können es mit versuchen (ls -R / &); exit
und dann mit grep danach suchen, um zu sehen, dass es noch läuft. Änderungen für ein besseres Beispiel als sind willkommen ls
.
Welchen Sinn hätte es überhaupt, es in einer Subshell-Umgebung auszuführen?
Um es vollständig von der Ausgangshülle zu lösen (siehe oben).