前のタスクのsigchld()に基づいて新しいタスクを実行する

私は現在、C ++内に小さなシェルを構築中です。

A user may enter a job at the prompt such as exe1 &&
exe2 &
. Similar to the BASH shell, I will only execute
exe2 if exe1 exits successfully. In
addition, the entire job must be performed in the background (as
specified by the trailing & operator).

現在、私はジョブの実行とそのジョブの実行可能ファイルと個々の引数/条件を含む job 構造体を処理する
jobManager を持っています。ジョブは、
fork()を呼び出して適切な引数を指定して
execvp()を呼び出すことによって開始されます。ジョブが終了すると、
SIGCHLD のシグナルハンドラがあり、終了したばかりのプロセスを判断するために
wait()を実行します。 exe1 が終了すると、その終了コードを確認して、
exe2 の起動を続行するかどうかを判断します。

私の心配は、 exe2 をどうやって起動するのかということです。
SIGCHLD
ハンドラのコンテキストからjobManagerのstart関数を使用すると、スタック上でハンギングする
SIGCHLD
ハンドラ関数が多すぎる可能性があります例えば10件の条件付き実行があった)。さらに、間接的に発生したとしても、シグナルハンドラから次の実行を開始するのは良い考えのようには思えません。
(私は1.5年前に信号処理について学んでいたときに同様のことをやろうとしました –
それは私にはうまくいかなかったことを思い起こさせるようです)。

上記のすべてがバックグラウンドで発生する必要があり、 exe1 が戻るのを待っている
jobManager
を待っているのを避けたいです。別のプロセスの実行を開始するのを待っている別のスレッドを持たないほうがいいでしょう。しかし、
SIGCHLD ハンドラから次のプロセスの実行を開始するように私の
jobManager に指示すると、コードが悪いようです。

どんなフィードバックも必要です。

ベストアンサー

I see two ways:
1)Replace you sighandler with loop that call “sigwait” (see man 3
sigwait)
then in loop

2)パイプの作成を開始する前に、プログラムのメインループではパイプハンドルで「選択」を使用して待ちます
イベント。シグナルハンドラのパイプへの書き込み、およびメインループハンドルの状況で。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です