これは宿題です
皆さん、これが私が今取り組んでいる課題の一部です。
& を使用してバックグラウンドで実行される、引数の有無にかかわらずコマンド。
簡単にするために、 & が存在する場合、常に行の最後にあると仮定します。
例: 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 は私にとってまったく新しいものです。
事前に感謝します。必要に応じて詳細を提供します:)