通常のファイルへの書き込み/読み取りはノンブロッキングにできないようです。サポートについては、次のリファレンスを見つけました。
The Linux Programming Interface: A Linux and UNIX System Programming Handbook から:
"--- ノンブロッキング モードは、デバイス (端末や擬似端末など)、パイプ、FIFO、およびソケットで使用できます。(パイプとソケットのファイル記述子は open() を使用して取得されないため、fcntl を使用してこのフラグを有効にする必要があります。 () セクション 5.3 で説明されている F_SETFL 操作.) O_NONBLOCK は、セクション 13.1 で説明されているように、通常のファイルの I/O がブロックされないことをカーネル バッファー キャッシュが保証するため、通常、通常のファイルでは無視されます。強制的なファイルロックが採用されている場合のファイル (セクション 55.4) ---"
UNIX 環境での高度なプログラミング第 2 版から:
「--- ディスク ファイルの読み取りまたは書き込みが呼び出し元を一時的にブロックする可能性があるとしても、ディスク I/O に関連するシステム コールは遅いとは見なされないことも述べました。 ---」
http://www.remlab.net/op/nonblock.shtmlから:
「---通常のファイルは常に読み取り可能であり、常に書き込み可能です。これは、関連するPOSIX仕様に明確に記載されています。これを十分に強調することはできません。通常のファイルをノンブロッキングに配置しても、1ビットを変更する以外の影響はまったくありません.ファイル フラグ. 通常のファイルからの読み取りには時間がかかる場合があります. たとえば、ファイルがビジーなディスク上にある場合、I/O スケジューラに時間がかかりすぎて、ユーザーがアプリケーションがフリーズしていることに気付く場合があります. それにもかかわらず、非-blocking モードは機能しません。単純に機能しません。ファイルの読み取り可能性または書き込み可能性のチェックは、常にすぐに成功します。システムが I/O 操作を実行するのに時間が必要な場合は、タスクを読み取りから割り込み不可能なスリープ状態にします。またはシステムコールを書き込みます。 ---」
メモリが十分に利用可能な場合、読み取り/書き込みはカーネル バッファリングを介して実行されます。
私の質問は次のとおりです。カーネルがメモリ不足で、バッファリングがすぐに使用できないというシナリオはありますか? はいの場合、カーネルは何をしますか? 単純にエラーを返しますか、それとも素晴らしいトリックを実行しますか?
みんなありがとう!