3

fork() と execv() を使用して、バックグラウンドで実行されているいくつかの子プロセスを生成し、そのうちの 1 つをフォアグラウンドに移動したい場合、どうすればよいでしょうか?

フォアグラウンドまたはバックグラウンドでプロセスを開始できるシェルを作成しようとしています。

4

3 に答える 3

4

「バックグラウンド」と「フォアグラウンド」は、プロセスに対して一般的に使用される用語ではなく、オンデマンドでジョブを待機できるシェルにのみ適用されます。

于 2011-04-26T04:43:26.883 に答える
3

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)

ここに私が見つけたいくつかの関連リンクがあります:

于 2011-04-29T04:25:27.593 に答える
1

fg を使用してプロセスをフォアグラウンドにし、bg を使用してプロセスをバックグラウンドにすることができます。プロセスをフォアグラウンドにするには、プロセスのpidを知っている必要があります。詳細については、fg および bg の Linux マニュアルを参照してください。

于 2011-04-26T06:13:02.387 に答える