シェルが終了しても終了しないプロセスをフォークするにはどうすればよいですか?「ダブルフォーク」について語ります:
ダブル
fork()
:(emacs &)
中括弧内のコマンドは
(
)
別のシェル プロセスで実行されます。
単純な と比べて、なぜそれが違いを生むのか説明していただけますかemacs &
。そもそも、サブシェル環境でそれを実行する意味は何でしょうか?
答え1
単純な と比べて、なぜそれが違いを生むのかを説明していただけますか
emacs &
。
(emacs &)
はサブシェルを実行し、サブシェルはemacs &
サブシェル内で実行されます。つまりstdin
、、、stdout
およびはstderr
サブシェルに結び付けられます。これは二重にフォークされ、最初のシェル (が実行されたシェル) が終了しても存続します(emacs &)
。のみを実行すると、、、およびが最初のシェルに結び付けられたemacs &
ままになります。stdin
stdout
stderr
emacs
stdin
は、実際にはこれの悪い例です。GUI バージョンでは、、、stdout
およびが失われたことは気にしないからですstderr
。 を試して(ls -R / &); exit
から grep で検索すると、まだ実行中であるかどうかがわかります。 より良い例については編集を歓迎しますls
。
そもそもサブシェル環境で実行する意味は何でしょうか?
初期シェルから完全に切り離します (上記参照)。