[解決済み] UNIXのノンブロッキングI/O。O_NONBLOCKとFIONBIOの比較
質問
BSD ソケットプログラミングの文脈で遭遇するすべての例や議論において、 ファイルディスクリプタをノンブロッキング I/O モードに設定するための推奨方法は
O_NONBLOCK
フラグを
fcntl()
に変更する必要があります。
int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
私は10年以上前からUNIXでネットワークプログラミングをしていますが、常に
FIONBIO ioctl()
の呼び出しで行ってきました。
int opt = 1;
ioctl(fd, FIONBIO, &opt);
なぜなのか、あまり考えたことはありません。 ただ、そのように学んだだけです。
どなたか、どちらか一方の利点についてコメントをお持ちではないでしょうか? ポータビリティの軌跡が多少異なることは想像できますが、その程度はわかりません。
ioctl_list(2)
はそのような個々の
ioctl
メソッドを使用します。
どのように解決するのですか?
標準化以前は
ioctl(
...
FIONBIO
...
)
そして
fcntl(
...
O_NDELAY
...
)
といった具合に、システム間、あるいは同じシステム内でも挙動が不統一でした。 例えば、よくあるのは
FIONBIO
はソケットで動作し
O_NDELAY
で、パイプ、FIFO、デバイスのようなものには多くの不一致があります。 また、ファイル記述子の種類がわからない場合は、念のため両方を設定する必要がありました。 OS やファイル記述子の種類によっては、読み取りが 0 を返すこともあれば、 errno EAGAIN で -1、あるいは errno EWOULDBLOCK で -1 を返すこともあります。 今日でも
FIONBIO
または
O_NDELAY
は、データ無しの読み出しの場合、ttyやパイプでは0を、ソケットでは errno EAGAINで-1を返します。 ただし、0はEOFの場合にも返されるため、あいまいです。
POSIXでは、この問題を解決するために
O_NONBLOCK
を導入することで、異なるシステムやファイル記述子の種類にまたがって動作を標準化しました。 既存のシステムは通常、後方互換性を壊すかもしれない動作の変更を避けたいので、POSIX は他のどれかに対して特定の動作を強制するのではなく、新しいフラグを定義しました。 Linux のように 3 つすべてを同じように扱い、EAGAIN と EWOULDBLOCK を同じ値に定義するシステムもありますが、下位互換性のために他の古い動作を維持したいシステムは、古いメカニズムが使用されている場合にそうすることができます。
新しいプログラムでは
fcntl(
...
O_NONBLOCK
...
)
というように、POSIXで標準化されています。
関連
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] UnixのタイムスタンプをDateTimeに、またはその逆に変換するにはどうすればよいですか?
-
[解決済み] Unixシェルスクリプトは、スクリプトファイルが存在するディレクトリを見つけることができますか?
-
[解決済み] Unixでテキストファイルからあらかじめ決められた範囲の行を抽出するには?
-
[解決済み] マンページでUnixコマンド名の後に表示される括弧内の数字は何を意味しているのですか?
-
[解決済み] UnixのコンソールやMacのターミナルでシェルスクリプトを実行するには?
-
[解決済み] Unixのシェルスクリプトで環境変数が設定されていることを確認する簡潔な方法は何ですか?
-
[解決済み] 講師が書いたC言語のファイルは、なぜ最初の行に#が一つ付いているのですか?
-
[解決済み] UnixでLessを使って特定の行番号に移動する
-
[解決済み] C言語の構造体(CGRectやCGPointなど)をNSLog化することは可能ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
_CRT_SECURE_NO_WARNINGS エラーメッセージ、解決方法
-
Solve Dev-c++ [エラー] 'for' ループの初期宣言は、C99 または C11 モードでのみ許可されます。
-
[解決済み] Xcode - 警告。C99 では関数の暗黙の宣言は無効です。
-
[解決済み] CコードでEOFを表現する?
-
[解決済み] c または c++ 用のシンプルな 2 次元クロスプラットフォームグラフィックスライブラリ?[クローズド]
-
[解決済み] char s[]とchar *sの違いは何ですか?
-
[解決済み] なぜsizeof(x++)はxをインクリメントしないのですか?
-
[解決済み] アセンブリがCより速いのはどんなとき?[クローズド]
-
[解決済み] FortranはC言語よりも重い計算を最適化しやすいですか?
-
[解決済み] C言語で "unsigned long "をprintfする方法は?