Oracle® Solaris 11.2 デバイスドライバの記述

印刷ビューの終了

更新: 2014 年 9 月
 
 

スレッドがシグナルを受信できない

スレッドがシグナルを受信したときに、sema_p_sig()cv_wait_sig()、および cv_timedwait_sig() の各関数を復帰させることができます。一部のスレッドがシグナルを受信できないことが原因で問題が起きる可能性があります。たとえば、アプリケーションが close(2) を呼び出した結果として close(9E) が呼び出されたときは、シグナルの受信が可能です。一方、開いているすべてのファイル記述子を閉じる exit(2) 処理の内部から close(9E) が呼び出されたとき、スレッドはシグナルを受信できません。スレッドがシグナルを受信できないとき、sema_p_sig()sema_p() として、cv_wait_sig()cv_wait() として、cv_timedwait_sig()cv_timedwait() としてそれぞれ動作します。

発生しない可能性があるイベントで、スリープし続けないように注意する必要があります。決して発生しないイベントは、強制終了できない (機能停止した) スレッドを作成し、システムをリブートするまでデバイスを使用不能にします。機能停止したプロセスはシグナルを受信できません。

現在のスレッドがシグナルを受信できるかどうかを検出するには、ddi_can_receive_sig(9F) 関数を使用します。ddi_can_receive_sig() 関数が B_TRUE を返す場合、受信したシグナルによって前述の関数を復帰させることができます。ddi_can_receive_sig() 関数が B_FALSE を返す場合、受信したシグナルによって前出の関数群を復帰させることはできません。ddi_can_receive_sig() 関数が B_FALSE を返す場合、デバイスドライバではtimeout(9F) 関数などの代替手段を使用して、再度復帰処理を行うべきです。

この問題が発生する重要なケースの 1 つはシリアルポートです。リモートシステムがフロー制御を表明し、出力データの排出を試みる間 close(9E) 関数がブロックする場合、フロー制御条件が解決されるか、システムがリブートされるまでポートがスタックする可能性があります。そのようなドライバでは、このケースを検出し、フロー制御条件の持続時間が長すぎるときに排出操作を中止するためのタイマーを設定するべきです。

この問題は、Chapter 7, STREAMS Framework – Kernel Level, in STREAMS Programming Guide で説明する qwait_sig(9F) 関数にも影響します。