コマンドラインから起動された実行中のCまたはC++プログラムをバックグラウンドに置くための最良の方法は何ですか?これは、ユーザーがコマンドの最後に「&」を付けてUNIXシェルから起動した場合と同じです。(ただし、ユーザーは必要ありませんでした。)これはGUIアプリであり、シェルI / Oを必要としないため、起動後にシェルを拘束する理由はありません。しかし、シェルコマンドの起動を「&」なしで(またはWindowsで)自動バックグラウンド化する必要があります。
理想的には、Linux、OS X、およびWindowsのいずれでも機能するソリューションが必要です。(または、#ifdefで選択できる個別のソリューション。)これは、実行の途中ではなく、実行の最初に実行する必要があると想定してもかまいません。
1つの解決策は、メインプログラムを、実際のバイナリを起動するスクリプトにして、慎重にバックグラウンドに配置することです。しかし、これらの結合されたシェル/バイナリペアが必要なのは満足のいくものではないようです。
別の解決策は、同じコマンドライン引数を使用して、実行された別のバージョン('system'またはCreateProcessを使用)をすぐに起動することですが、子をバックグラウンドに置き、親を終了させます。しかし、これは、それ自体をバックグラウンドに置くプロセスと比較すると、不格好に思えます。
いくつかの回答の後に編集:はい、fork()(またはsystem()、またはWindowsのCreateProcess)は、これを行うための1つの方法であり、元の質問で示唆しました。ただし、これらのソリューションはすべて、バックグラウンドで実行される2番目のプロセスを作成してから、元のプロセスを終了します。EXISTINGプロセスをバックグラウンドに置く方法があるかどうか疑問に思いました。1つの違いは、アプリがプロセスIDを記録したスクリプトから起動された場合(おそらく後で強制終了するなどの目的で)、新しくフォークまたは作成されたプロセスは異なるIDを持つため、起動スクリプトで制御できないことです。あなたは私が何をしているのかわかります。
編集#2:
fork()は、OS Xの適切なソリューションではありません。「fork」のマニュアルページには、特定のフレームワークまたはライブラリが使用されている場合は安全ではないと記載されています。試してみましたが、実行時にアプリが大声で文句を言います。「プロセスが分岐し、このCoreFoundation機能を安全に使用できません。exec()を実行する必要があります。」
私はdaemon()に興味をそそられましたが、OS Xで試してみると同じエラーメッセージが表示されたので、fork()の単なるラッパーであり、同じ制限があると思います。
OS Xの中道政治を失礼します、それはちょうど今私の目の前のシステムです。しかし、私は確かに3つのプラットフォームすべてに対する解決策を探しています。