ソケット入出力モード

ソケットは、ブロッキング入出力モードまたは非ブロッキング入出力モードのいずれかに設定できます。

このモードを判別するには、 FIONBIO ioctl 操作を使用します。 FIONBIO ioctl が設定されると、ソケットは非ブロッキングとしてマークされます。 読み取りが試行され、必要なデータが使用可能でない場合、ソケットはデータが使用可能になるのを待機しませんが、即時に EWOULDBLOCK エラー・コードとともに戻ります。

注: EWOULDBLOCK エラー・コードは、 _BSD 定義で定義され、 EAGAIN エラー・コードと同等です。

FIONBIO ioctl が設定されていない場合、ソケットはブロック・モードになります。 このモードでは、読み取りが試行され、必要なデータが使用できない場合、呼び出しプロセスはデータを待機します。 同様に、書き込み時に、 FIONBIO が設定されていて、出力キューがいっぱいの場合は、書き込みを行おうとすると、エラー・コード EWOULDBLOCKでプロセスが即時に戻ります。

ソケットで非ブロッキング入出力を実行する場合、プログラムは EWOULDBLOCK エラー・コード ( errno グローバル変数に保管されている) を検査する必要があります。 これは、通常は操作がブロックされるが、その操作が実行されたソケットが非ブロッキングとしてマークされている場合に発生します。 以下のソケット・サブルーチンは、 EWOULDBLOCK エラー・コードを戻します。

これらのサブルーチンを使用するプロセスは、 EWOULDBLOCK エラー・コードを処理する準備をしておく必要があります。 非ブロッキング・ソケットの場合、 connect サブルーチンは EINPROGRESS エラー・コードを戻します。

send 操作などの操作を完全には実行できないが、部分書き込みは許可されている場合 (例えば、ストリーム・ソケットを使用する場合)、即時に送信できるデータは処理され、戻り値は実際に送信された量を示します。