ソケットが作成されるか、C でファイルが開かれる/作成される場合、ソケット/ファイルに割り当てられたファイル記述子は、利用可能な最も低い値の記述子であることが保証されていますか? この点に関して、C 仕様はファイル記述子の割り当てについて何と言っていますか?
6 に答える
最低であることが保証されているわけではなく、実装に依存します(1)。ただし、一般に、開いているファイル記述子を割り当てるルーチンは、最初に開く方法を使用します。いくつかの低いディスクリプタが解放された直後に、予想よりも高いディスクリプタが残る可能性があります。
ただし、これを知ることができる唯一の理由は、チェックする必要がある最高のファイル記述子を渡すと高速化される select 関数のためです。
(1) IEEE 標準に従う実装では、ファイルの未使用記述子が最も低いことを保証しますが、これはソケットには適用されない場合があることに注意してください。すべての実装が open() の IEEE 標準に準拠しているわけではないため、移植可能なソフトウェアを作成している場合は、IEEE 標準に依存しないことをお勧めします。
C仕様では見つからないと思いますが、OSの仕様である可能性が高いです。Linux での私の経験では、Linux は常に最低です。
別の質問でこれに反論します - なぜこれが問題なのですか? ファイル記述子を何かと比較したり(stdin/stdout/stderrをチェックしない限り)、それを使って計算したりしないでください。int に収まる限り (および保証される限り)、本当に知っておく必要があるのはそれだけです。
C仕様では、実装に依存するとされています。Unixの実装を見ている場合、open(2)のマニュアルページには、「成功した呼び出しによって返されるファイル記述子は、プロセスに対して現在開かれていない最小番号のファイル記述子になります」と書かれています。
これは、特定のファイルを特定の記述子に添付しようとしている場合に役立ちます。stderrを/dev/nullにリダイレクトするとします。何かのようなもの
close(2); open( "/ dev / null"、O_WRONLY);
それをするべきです。もちろん、openによって返されるfdをキャプチャし、それが2であることを確認する必要があります。
@aib open()、close()、lseek()、read()、write() はすべてファイル記述子を使用します。I/O にストリームを使用することはほとんどありません。
@Kyle select() のようなステートメントのために重要です。最高の記述子を知ることで、パフォーマンスを向上させることができます。
スティーブ M は正しいです。C にはソケットの概念がなく、そのファイル I/O 関数は記述子ではなく [ポインタへの] FILE オブジェクトを使用します。