sigwait() の前に信号をブロックする必要があるのはなぜですか?

sigwait() の前に信号をブロックする必要があるのはなぜですか?

APUE第12章454ページでは、次のように述べています。

誤動作を防ぐには、スレッドが待機している信号をブロックする必要があります。

標準にも同様の内容があります。

信号は次のように定義されます。置く呼び出されたらブロックしなければなりませんでした。シグウェイト();それ以外の場合、動作は定義されません。

このテキストでは、どのバグ/未定義の動作について説明しますか?標準に近い、またはアプリケーションの使用法を見つけることができず、本の説明を理解するのが困難です。

信号がブロックされていない場合...呼び出しが完了する前に信号がスレッドに転送されるタイミングウィンドウが開きますsigwait

答え1

これはから来たものですqnx ドキュメントただし、すべてのUnixおよびUnixファミリーディストリビューションに関連しています。

sigwait() を呼び出す前に、セット定義信号をブロックする必要があります。ブロックしないと、コールが行われる前にシグナルが転送され、コールがブロックされる可能性があるため、競合状態が発生します。

答え2

この回答は、まず読者に標準開発の歴史的観点を提示し、次に要件の理由を説明するために、標準の特定のテキストに読者の関心を導きます。

XPG Issue 3 では、POSIX.1-1988 標準と一致するように、 、sigactionと が導入されました。この中で、信号構成を指定するための最も包括的で一貫したインターフェースを提供し、信号に対する細分化された応答方法を提供します。sig*setsigismembersigpendingsigprocmasksigsuspendsigactionsigpendingsigprocmasksigsuspend

XPG Issue 4(現在最も古いデジタル形式)には、、sigaltstackが導入されました。最新の標準は、そのソースがどこにあるかを明らかにせず、シングルスレッドプロセス内でのみ機能するため、ほとんど役に立たないと言います。sig{hold,ignore,pause,relse,set}siginterruptsigaltstack

XPG Issue 5 (Single Unix Spec Version 2) では、POSIX リアルタイムおよびスレッディング拡張との一貫性のため、、、pthread_sigmaskおよびsigqueueが導入されました。sigtimedwaitsigwaitinfosigwait

さて、標準の他の2つの部分を見ることが重要です。

システムインターフェース一般情報ボリューム、信号概念1位:

...信号がスレッドに渡されることを「ブロックする」ことができます。ブロッキング信号に関連するアクションがシグナルを無視せずにスレッドに対してシグナルが生成された場合、シグナルは呼び出しによって選択され、返されたときにブロッキング解除されるまで保留状態にしておく必要があります。この関数は許可されてsigwait()いるか、関連する操作はこの信号を無視するように設定されます。

sigwaitsigtimedwait明らかに信号を無視する可能性に加えて、信号がプロセス/スレッドに到達することができる2つの方法があります。つまり、ブロックを解除するか(およびその兄弟アイテムによってsigwaitinfo承認される方法)があります。

2位sigaction

プロセス内の同じシグナルに対してsigaction()関数とsigwait()関数の両方を使用した結果は指定されません。

明らかに、sigwaitこれは信号を処理する第2の方法であると考えられた。

sigtimedwaitこれは、Fundamentals of Interfacesの次のテキストでさらに確認されますsigwaitinfo

sigwait関数は、スレッドが非同期的に生成された信号を待つ同期メカニズムを提供します。

関連情報