2016-05-02 8 views
1

ソケットからデータを読み取るのにrecv()、ソケットブロッキング/ノンブロッキングを設定するのにfcntl()を使用しています。私の質問は:recv()(ブロッキング)を呼び出し、別のスレッドからfcntl()を呼び出してソケットを非ブロッキングに設定した場合、現在実行中のrecv()リターンまたはfcntl()の結果は、ブロッキング後にのみ発生し、recv()が返されます再び?ブロッキングrecv()vs fcntl()

+2

試してみてください。ソケットがブロッキングと非ブロッキングの両方になり、ステータスで別のスレッドが邪魔になることが奇妙です。 linuxでは、クライアント上でsocket()、サーバ上でaccept4()を使用して作成時にソケット非ブロックを設定します。 –

+0

'recv'呼び出しでブロックされたスレッドを非同期で起床しようとしていますか?もしそうなら、 'fcntl'が望みの結果をもたらすとしても、おそらくもっと良い/より安全な方法があります。例えば、 'poll'を使って外部の' recv'ソケット*または*プロセス内通知のためだけに使用される内部専用ソケットをブロックします。 –

+0

@BrianMcFarlandこれはまさに私がやろうとしていたことですが、EJPの答えによればうまくいかないので、私はあなたのアイデアを検討します。ありがとう! –

答えて

2

現在の受信動作には影響しません。

奇妙なことです。

+0

答えをありがとう!私はこのメソッドを使用してスレッドをブロックする目を覚ましたかったのですが、私は他のオプションを検討すると思います。 –

+0

@BertalanRadostyan: "*ブロッキングスレッドを目覚めさせたい*"スレッドにシグナルを送ります(SA_RESTARTがシグナルハンドラでないことを確認してください)。 – alk