4

これは宿題です

皆さん、これが私が今取り組んでいる課題の一部です。

& を使用してバックグラウンドで実行される、引数の有無にかかわらずコマンド。
簡単にするために、 & が存在する場合、常に行の最後にあると仮定します。
例: vi &
詳細: この場合、シェルはコマンドを実行し、コマンドが終了するまでブロックせずに、すぐに戻る必要があります。対話型入力を必要としないプロセスのバックグラウンド化と、who コマンドと vi コマンドのようにバックグラウンド化を行うプロセスを区別する必要があります。
概念: バックグラウンド実行、シグナル、シグナル ハンドラー、プロセス グループ、非同期実行。システムコール: sigset()、sigaction() シグナル: SIGTTOU

それで、私たちは「独自のシェル」を C で書いています。これまでに書いたコードは問題なく動作しています。ここにいくつかのスニペットがあるので、私が何をしているかを見ることができます:

// Check for ampersand
block = (ampersand(args) == 1);

アンパサンド関数は機能し、デバッグ ステートメントに従って適切に戻ります。ここでは、実際にバックグラウンド コードを実行する必要があるとほぼ確信しています。ここでヘルプを探しています。

// Wait for the child process to complete, if necessary
  if(block) {
//If this executes, there IS an ampersand, and should be backgrounded
    printf("Waiting for child, pid = %d\n", child_id);
    result = waitpid(child_id, &status, 0);
  } else {
  //If this gets executed, there is no ampersand, and should not be backgrounded
    result = waitpid(child_id, &status, 0);
  }

これで、「ls -l &」と入力すると、ls -l コマンドが実行され、その printf ステートメントが実行されるところまで来ました。それでいいです。そこに & を入れないと、printf は実行されません。また良い。

百万ドルの質問: printf ステートメントを実行したら、その時点で何をすればよいですか? これは入門コースであり、既に記述したコード以外のことはあまり知らないことに注意してください。つまり、C は知っていますが、Unix は私にとってまったく新しいものです。

事前に感謝します。必要に応じて詳細を提供します:)

4

1 に答える 1

2

がありfunction exec_cmd_with_child(\*params*\)、適切な引数を指定してコマンドを実行するとします。この関数は、if と else の両方から呼び出す必要があります。

唯一の違いは次のとおりです。内部if(block)では、親プロセスがコマンドの実行を待機しないため、wait を呼び出しません。内部elseでは wait を呼び出す必要があります。つまり、親はコマンドが実行されるまで待機し、次のコマンドを要求しません。

フォアグラウンドでプロセスに戻したい場合は、注意すべきことがたくさんありますが、それを求められない場合は、問題ありません。

于 2013-09-30T17:55:52.067 に答える