複数の子プロセスを生成する親プロセスがあります。SIGCHLD
シグナルハンドラを登録して、子プロセスがいつ終了するかを知りたいです。
SIGCHLD
問題は、親プロセスが既にシグナル ハンドラーにあるときに、別の (または他のシグナル) を受信した場合はどうなるかということです。
次の結果が考えられます。
- 信号は無視されます
- シグナルはキューに入れられ、現在のハンドラーが戻るとすぐに処理されます
- メインプログラムと同様に、現在のハンドラーが順番に中断されます
どちらが正しいですか?
あなたの具体的な例(同じシグナルが受信されている)では、シグナルハンドラーが終了した後にシグナルが配信されます(したがって、箇条書き#2は正しいです)。ただし、シグナルを「失う」可能性があることに注意してください。
その理由は、シグナルがハンドラー内にある間はブロックされるためです。ブロックされたシグナルは保留に設定されますが、キューには入れられません。「保留中」という用語は、次の機会に配信されるのを待っているシグナルがあることをオペレーティングシステムが記憶していることを意味し、「キューに入れられていない」ということは、どこかにフラグを設定することによってこれを行うことを意味しますが、方法の正確な記録を保持することによってではありません多くの信号が到着しました。
したがって、ハンドラー内でさらに 2 つまたは 3 つ (または 10 つ) 受け取ることができますが、SIGCHLD
表示されるのは 1 つだけです (したがって、場合によっては、箇条書き #1も正しい可能性があります) 。
渡すことができるいくつかのフラグは、(シグナルのブロックを防止する) や(一部のシステムではシグナルをまったく生成しない可能性がある)sigaction
など、デフォルトの動作に影響を与える可能性があることに注意してください。SA_NODEFER
SA_NOCLDWAIT
もちろん、異なるタイプのシグナルを受信した場合、ハンドラーが中断されないという保証はありません。そのため、非シグナルセーフ関数を使用しないことをお勧めします。