現在、C++ 内で小さなシェルを作成中です。
ユーザーは、 などのプロンプトでジョブを入力できますexe1 && exe2 &
。BASH シェルと同様に、正常に終了したexe2
場合にのみ実行します。exe1
さらに、ジョブ全体をバックグラウンドで実行する必要があります (末尾の&
演算子で指定)。
現在、ジョブの実行jobManager
を処理する とjob
、ジョブの実行可能ファイルとそれらの個々の引数/条件を含む構造体があります。を呼び出してから、適切な引数を指定して呼び出すfork()
と、ジョブが開始されます。ジョブが終了すると、どのプロセスが終了したかを判断するために実行するexecvp()
のシグナル ハンドラーがあります。終了したら、その終了コードを観察し、 launch に進むべきかどうかを判断します。SIGCHLD
wait()
exe1
exe2
私の懸念は、どのように起動するかですexe2
。ハンドラーのコンテキストから jobManager の開始関数を使用すると、スタックにぶら下がっているハンドラー関数SIGCHLD
が多すぎる可能性があるのではないかと心配しSIGCHLD
ています (たとえば、10 個の条件付き実行があった場合)。さらに、たとえそれが間接的に発生していたとしても、シグナルハンドラから次の実行を開始するのは良い考えではないようです。(1.5年前、シグナル処理について学んでいたときに、似たようなことをしようとしました-失敗したことを思い出しているようです)。
jobManager
上記のすべてをバックグラウンドで実行できるようにする必要があり、忙しい状態で座っているだけで戻ってくるのを待っているのを避けたいと思いexe1
ます。また、別のプロセスの実行を開始するのを待っているだけの別のスレッドを持たないようにしたいと思います。ただし、ハンドラーjobManager
から次のプロセスの実行を開始するように指示するのは、貧弱なコードのようです。SIGCHLD
フィードバックをお待ちしております。