0

pselect の man ページで次のパラグラムを見ました。

pselect() が必要な理由は、シグナルまたはファイル記述子の準備が整うのを待ちたい場合、競合状態を防ぐためにアトミック テストが必要になるためです。(シグナルハンドラがグローバルフラグを設定して戻ると仮定します。この場合、このグローバルフラグのテストに続いて select() の呼び出しが行われると、テストの直後で呼び出しの直前にシグナルが到着した場合、無期限にハングアップする可能性があります。対照的に、pselect は、 () では、最初にシグナルをブロックし、入ってきたシグナルを処理してから、目的の sigmask を指定して pselect() を呼び出し、競合を回避できます。)

段落に記載されている競合状態がどのように発生するのかわかりません。それを理解するのを手伝ってもらえますか? ありがとう。

4

1 に答える 1

0

シグナル ハンドラーが呼び出されたときにグローバル g_Signaled を設定し、次のようなコードがあるとします。

if( g_Signaled == false )
{
   // Suppose signal is fired here, after test of g_Signaled but before entering select.
   select( ... );
}

この場合、シグナルが発火しても、選択は無期限にブロックされます。pselect は、信号を一時的にブロックし、フラグをテストしてから、pselect を使用してアトミックに信号をブロックし、再度有効にすることができるため、問題を解決します。

于 2014-01-21T01:59:55.463 に答える