親プロセスから切り離す手順は簡単です。サブシェルのバックグラウンドで、コマンドを実行しsetsid
(新しいセッションで開始されるように)、標準入力、出力、およびエラーを/dev/null
(または必要に応じて別の場所に) リダイレクトします。新しいシェルを開始するためsystem()
、そのようなサブシェルと同等であるため、
system("setsid COMMAND </dev/null >/dev/null 2>/dev/null &");
必要なことを正確に行います。シェルスクリプトでは、同等のものは
( setsid COMMAND </dev/null >/dev/null 2>/dev/null & )
(シェル スクリプトにはサブシェルが必要ですCOMMAND
。そうしないと、 は現在のシェルのジョブ制御下に置かれるためです。 を使用する場合は重要ではありませんsystem()
。いずれにせよ、コマンドのためだけに新しいシェルが開始されるためです。シェルは、コマンドが終了すると終了します。)
リダイレクトはCOMMAND
、 が現在の端末に対して開いている記述子を持っていないことを確認するために必要です。(ターミナルが閉じると、そのようなすべてのプロセスに TERM シグナルが送信されます。) これは、標準入力、標準出力、および標準エラーのすべてをリダイレクトする必要があることを意味します。上記のリダイレクトは、Bash シェルと POSIX シェルの両方で機能しますが、古いバージョンの/bin/sh
. 特に、すべての Linux ディストリビューションで動作するはずです。
setsid
新しいセッションを開始します。COMMAND
独自のプロセス グループのプロセス グループ リーダーになる。シグナルは、単一のプロセスまたはプロセス グループ内のすべてのプロセスに送信できます。終了シグナルは通常、プロセス グループ全体に送信されます (アプリケーションは技術的に複数の関連プロセスで構成されている場合があるため)。新しいセッションを開始するとCOMMAND
、親プロセスが属するプロセス グループがプロセス グループ全体のシグナルによって強制終了された場合でも、確実に強制終了されません。