2008-09-09 19 views
3

ソケットが作成された場合、またはファイルがCでオープン/作成された場合、ソケット/ファイルに割り当てられたファイルディスクリプタが最低値のディスクリプタであることが保証されていますか? C仕様では、この点に関するファイル記述子の割り当てについて何が言いますか?Cでのファイル記述子の割り当て

答えて

5

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

私はこのことを知ることができると思う唯一の理由は、select関数のためです。チェックする必要がある最も高いファイル記述子を渡すとスピードアップします。

(1) IEEE標準に準拠する実装では、ファイルの最も低い未使用ディスクリプタが保証されていますが、これはソケットには当てはまりません。すべての実装がopen()のIEEE標準に準拠しているわけではありませんので、ポータブルソフトウェアを作成する場合は、それに依存しないことをお勧めします。

+5

open()を呼び出すと、利用可能な最も低いファイル記述子が返されます。http://www.opengroup.org/onlinepubs/009695399/functions/open.html ソケットの保証はありません。 –

+0

リマインダと具体的なリファレンスをありがとう! –

+4

「IEEE標準」とは、POSIXです。これについて言及する価値は... –

4

私はCスペック、おそらくあなたのOSの仕様では見つからないと思います。 Linuxでの私の経験は、常にそれが最も低いということでした。

2

私はこれを別の質問と相殺します - なぜこのことが重要ですか? (stdin/stdout/stderrをチェックしない限り)ファイル記述子を何かと比較したり、数式を使ったりするべきではありません。あなたが知る必要があるのはint(そして保証されている)に収まる限りです。

+1

それをselectと共に使うと 'fd_set'オブジェクトに収まる必要があります。 POSIXでは、ファイルディスクリプタを順番に割り当てる必要があるため、同様にファイルディスクリプタのセットを格納するために独自のビット配列オブジェクトを使用したい場合があります。 –

0

スティーブMが正しくあります。 Cにはソケットの概念はなく、ファイルI/O関数はディスクリプタではなくFILEオブジェクトへのポインタを使用します。

+0

Cには実際にファイルを読み取る2つの方法があります.1つはFILEオブジェクトで、もう1つはファイルディスクリプタです。 –

+1

ファイル記述子に基づく方法は、Unix APIによって提供されるシステムコールインタフェースであり、C適切な部分ではありません。 – wnoise

0

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

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

0

C仕様では、実装に依存していると言われています。 Unixの実装を見ているならば、open(2)のmanページは "成功した呼び出しによって返されたファイルディスクリプタは、プロセスのために現在開いていない最も小さい番号のファイル記述子になります"と述べています。

特定のディスクリプタに特定のファイルを添付しようとしている場合に役立ちます。 stderrを/ dev/nullにリダイレクトしたいとします。何かのように

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

する必要があります。もちろん、オープンで返されたfdをキャプチャして、それが2であることを確認する必要があります。

+0

または 'dup2'を使用して、目的のファイル記述子に正しいストリームを割り当てるようにします。 – LnxPrgr3

+1

プログラムがスレッドを使用していて、他のスレッドが何をしているのかを厳密に制御できない場合は、 'dup2'だけが安全な方法です。 'close' /' open'は、他のスレッドがファイル記述子を取得する競合状態を引き起こします。 –

関連する問題