シグナル、シグナルマスク、セマフォの自作 11/12

先週の課題4についての 補足説明

sigaction( int signum, struct sigaction * new ,struct sigaction * old )
シグナルハンドラの登録を行う。シグナルハンドラはすべてのスレッドに共通する。 スレッド毎に違うハンドラを登録することはできない。

pause()
何もせず、シグナルが届くのを待つ。シグナルが届くと、 シグナルハンドラが呼ばれ、ハンドラ実行後、pause() の後から実行が 再開される。

pthread_sigmask( int how, const sigset_t * new, sigset_t * old)
シグナルをマスクする。シグナルは無視される(捨てられる)のではなく、 「保留」され、マスクされていた間に発生していたシグナルは、マスクが解除 されると、その時点で処理される。(ハンドラが呼ばれる。)

マスクは、スレッド毎に設定できる。子スレッドで何もマスクを設定しないと 親スレッドのマスクが受け継がれる。

sigsuspend( const sigset_t * mask )
マスクの設定(解除)と pause() をアトミックに行う。これによって、「待つ」 準備ができる前にシグナルが処理されてしまうことを避ける。

sigset_t
シグナルの集合を指定するためのデータ型。 sigemptyset で集合を空にして、 sigaddset でシグナルを追加する。 シグナルをマスクするときに、マスクしたいシグナルをこの型のデータで指定する。 空集合でマスクを設定すると、全てのマスクが解除される。

提出課題 (2ステップあわせて配点4点)