2016-07-14 8 views
-2

私はソケットプログラミングについての資料をオンラインで読みました。デフォルトではwrite()がブロックされています。いくつかの資料では、write()は、ソケットバッファがいっぱいになったときだけブロックします。他の資料では、ユーザーバッファ内のすべてのデータがシステムバッファに移動されるまで、write()がブロックされていると言われています。つまり、データを格納するための十分な領域がない場合はブロックされます。 write()がブロックに設定されている場合、どのステートメントが正しいか不思議です。ノンブロッキングcの書き込み

+0

どのソケットですか? Windows? –

+1

@o_weismanご返信ありがとうございます。 Linuxシステム。 – HuangJie

+0

問題のosをタグとして追加することをお勧めします。 – sjsam

答えて

0

write関数は、ディスクリプタがソケットの場合、send()関数のように動作します。 write()関数は、内部バッファがいっぱいで、すべてのデータを送信できるようになるまでブロックします。これは、ソケットがブロックされていることを前提としています。書き込み機能は信号によって中断することができます。 errnoはEINTRに設定され(戻り値はシグナルがキャッチされたときに書き込まれたバイト数になります)、すべてのデータが送信されるまでwrite()を再度呼び出すことができます。ソケットバッファがいっぱいになったとき

)は(書き込み、ブロックのみをいくつかの材料で

http://pubs.opengroup.org/onlinepubs/009695399/functions/write.htmlhttp://pubs.opengroup.org/onlinepubs/009695399/functions/send.html

+0

私が上記に投稿したsend()関数へのリンクでは、メッセージを送信するためのスペースが送信ソケットで利用できず、ソケットファイル記述子にO_NONBLOCKが設定されていない場合、sendスペースが利用可能になるまで。だからおそらくこれがあなたが探していた答えです。私が書いたように、write()関数に渡されたすべてのデータが内部バッファに書き込まれるまでは、「すべてのデータを送信できるようになるまで」と書いていました。私は怠惰な言葉をお詫びし、あなたを誤解させることを意味しませんでした。 –

1

を参照してください。他のマテリアルでは、ユーザーバッファ内のすべてのデータがシステムバッファに移動されるまでwrite()がブロックされていると言います。つまり、データを配置するための十分な領域がない場合、write()もブロックします。

これは実際には何か違う言葉です。

まず、「システムバッファ」とは、「ソケットバッファ」と呼ばれるものですが、同じものです。

第2ステートメントでは、「ソケットバッファがいっぱいになったときにwrite()ブロックのみ」と書かれていると、「書き込み操作が(システム)バッファをオーバーフローさせるときにのみブロックする」と解釈する必要があります。これは、 "ユーザバッファ内のすべてのデータがシステムバッファに移動されるまで、write()がブロックされている"と同じです。条件がwrite()をブロックし、条件がfalseになるとブロックが終了すると、条件がwrite()をブロックするということだけです。これは矛盾しない。

関連する問題