同一シグナルに対する複数ハンドラー

cobpostsighandler() は、同一のシグナルに対して 2 つ以上のハンドラーを可能にします。 シグナルがオペレーティング システムで生成された場合 (たとえば、割り込みキーが押されて SIGINT が発生)、各ハンドラーは適切な処理を行い、他のハンドラーが実行されるようにします (0 でない値を返却)。 あるいは、他のハンドラーが実行されるのを防ぐために、0 の値を返却して、シグナルを「無視」させることもできます。 しかし、そのハンドラーが同一のシグナルで他のハンドラーと協働できるように、優先度 140 (あるいは、それ以上) のハンドラーは、他のハンドラーが通知される機会を作るために、0 でない値を返却しなければなりません。 優先度 128 のハンドラーは、ランタイム システムのデフォルト動作 (終了) を行わせたくなければ、0 を返却できます。

たとえば、SIGINT を発生する CTRL+C を使用したり、異なる実行単位やアプリケーションにシグナルを発生するようなシグナルを発生する場合、そのシグナル ハンドラーだけを呼び出し、他のシグナル ハンドラーがそのシグナルを実行させたくない場合があります。 このような場合、シグナルを発生する前にグローバルリソースを設定し、そのリソースをシグナル ハンドラーでチェックします。 リソースが設定されている場合、シグナルが発生させられます。これにより、適切な処理を実行し、他のハンドラーが想定外で起動されないように 0 を返却します。 リソースが設定されていなければ、どこか他 (あるいは、オペレーティング システム) でシグナルが発生させられたので、0 でない値を返却し、他のハンドラーに実行させます。

グローバルリソースの例としては、グローバル変数 (同一実行単位の場合)、共有メモリ、ファイル、などがあります。 したがって、上記の例では、alarm() シグナルを発生する前に、グローバル変数を設定します。 そのグローバル変数を、シグナル ハンドラー mysigcatch() でチェックします。 グローバル変数が設定されていると、その変数をリセットし 0 を返却します。 しかし、グローバル変数が設定されていなければ、他の処理でそのシグナルを発生したと考えられます。 これで、そのハンドラー自身の処理を行わず、0 でない値を直ちに返却する必要があります。 これにより、他のハンドラーで適切な処理が行われます。