fork() と execv() を使用して、バックグラウンドで実行されているいくつかの子プロセスを生成し、そのうちの 1 つをフォアグラウンドに移動したい場合、どうすればよいでしょうか?
フォアグラウンドまたはバックグラウンドでプロセスを開始できるシェルを作成しようとしています。
「バックグラウンド」と「フォアグラウンド」は、プロセスに対して一般的に使用される用語ではなく、オンデマンドでジョブを待機できるシェルにのみ適用されます。
Ignacio Vazquez-Abram's answerに合わせて、シェルのフォアグラウンド/バックグラウンド モデルをエミュレートすることをお勧めします。
私の知る限り、プロセスをバックグラウンド化するということは、プロセスを一時停止することを意味します。これを行う最も簡単な方法は、 を使用することですSIGSTOP
。プロセスをフォアグラウンドにするときは、それを送信しSIGCONT
ます。「ジョブ」の 1 つだけが現在フォアグラウンドにある限り、セッションのtty
.
kill(child_pid, SIGSTOP);
kill(child_pid, SIGCONT);
fork
後と前に各プロセスを一時停止しexecv
、シェルのユーザーに、不変条件を維持するために後でそれらをフォアグラウンドにするオプションを与えることができます。
if (!fork()) { // we are the child
raise(SIGSTOP); // suspend self
execv(...); // run the command (after we've been resumed)
ここに私が見つけたいくつかの関連リンクがあります:
fg を使用してプロセスをフォアグラウンドにし、bg を使用してプロセスをバックグラウンドにすることができます。プロセスをフォアグラウンドにするには、プロセスのpidを知っている必要があります。詳細については、fg および bg の Linux マニュアルを参照してください。