質問

C でソケットが作成されたり、ファイルが開かれたり作成されたりする場合、ソケット/ファイルに割り当てられるファイル記述子は、利用可能な最も低い値の記述子であることが保証されますか?この点に関して、C 仕様ではファイル記述子の割り当てについて何と記載されていますか?

役に立ちましたか?

解決

最低値であることは保証されておらず、実装に依存します (1). 。ただし、一般に、オープン ファイル記述子を割り当てるルーチンでは、最初にオープンする方法が使用されます。ただし、いくつかの低い記述子が解放された直後に、予想よりも高い記述子が残る可能性があります。

ただし、これを知る唯一の理由は、選択関数のためです。チェックする必要がある最上位のファイル記述子を渡すと、この関数の速度が向上します。

(1) IEEE 標準に準拠した実装では、ファイルの未使用記述子が最低であることが保証されますが、これはソケットには適用されない可能性があることに注意してください。すべての実装が open() の IEEE 標準に従っているわけではないため、移植可能なソフトウェアを作成している場合は、それに依存しないことが最善です。

他のヒント

C 仕様では見つからないと思います。おそらく OS の仕様です。私の Linux での経験では、Linux は常に最低です。

これには別の質問で反論します。なぜこれが重要なのでしょうか?ファイル記述子を何かと比較したり (stdin/stdout/stderr をチェックしない限り) 計算したりするべきではありません。それが int に収まる (そしてその保証がある) 限り、本当に知る必要があるのはそれだけです。

スティーブ M は正しいです。C にはソケットの概念がなく、そのファイル I/O 関数は記述子ではなく [ポインター] FILE オブジェクトを使用します。

@aib open()、close()、lseek()、read()、write() はすべてファイル記述子を使用します。I/O にストリームを使用することはほとんどありません。

@Kyle select() のようなステートメントがあるため、それは重要です。最高の記述子を知ることでパフォーマンスを向上させることができます。

C 仕様には、実装に依存すると記載されています。Unix の実装を見ている場合、open(2) のマニュアル ページには、「成功した呼び出しによって返されるファイル記述子は、プロセスに対して現在オープンされていない最も小さい番号のファイル記述子になります。」と書かれています。

これは、特定のファイルを特定の記述子に添付しようとする場合に役立ちます。stderr を /dev/null にリダイレクトしたいとします。何かのようなもの

閉じる(2);open("/dev/null", O_WRONLY);

そうすべきだ。もちろん、open によって返された fd をキャプチャし、それが 2 であることを確認する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top