シグナル、シグナルマスク、セマフォの自作 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点)
ステップ1
以下の内容をメールで提出する。
自作した class MySemaphore のソース。
wait 関数の説明、その中でも特に排他制御変数の lock, unlock の配置についての説明
Subject を
OS-1112-1
とすること。
〆切: 11月14日(金)12:00
ステップ2
14日(金)13:00に公開される
実装例
と自分で作成したもの を比較し、何が違うか、その違いによって、機能、性能、信頼性の面で違いが 生じるかどうか検討する。その内容をメールで提出する。
Subject を
OS-1112-2
とすること。
〆切: 11月18日(火)17:00