私が発見しておくと、ファイルディスクリプタのものが用意されてい - ほとんどすべてのものは、ファイル記述子の周りに抽象化されています(例)通常ファイル、ソケット、信号およびタイマー。すべてのファイルディスクリプタは、単なる整数です。
ファイルディスクリプタを考えると、それがあるタイプかを知ることは可能ですか?例えば、getFdType(FD)などのシステムコールを持っていいだろう。
イベントがepoll_waitが複数のファイルディスクリプタは準備のために起こされている場合は、各ファイルディスクリプタの処理は、そのタイプに基づいてされます。それは私がタイプを必要とする理由です。
もちろん、私は別に自分でこの情報を維持することができるが、システムがそれをサポート持っている方が便利だろう。
また、全てのファイルディスクリプタは、シーケンシャルタイプのに関わらず、です。あなたは、通常のデータファイルを開いた場合、私は意味し、その後、タイマーファイルディスクリプタを作成し、その後、信号ファイルディスクリプタ、それらはすべて順番に番号が付けされることが保証されていますか?
「他の男は」言及したように、最も明白な呼び出しがありますfstat
。st_mode
部材等通常のファイル、デバイス、ソケット、パイプ、区別するためにビットを含みます
しかし実際には、あなたはほぼ確実にそのFDの自分を追跡し続ける必要がありますされています。それを知ることは、あなたはいくつかの異なる通常のファイルが開いているとき、通常のファイルではあまり助けにはならないのです。あなたは、そのレコードに背中を参照して、とにかくあなたのコード内でこの情報をどこかを維持する必要があるためので、行くための最も強力な方法であるように思われます。
(また、一つまたは複数の追加のシステムコールを作ることよりも、あなたのプログラムの中にいくつかの変数をチェックするためにはるかに高速になるだろう。)
また、全てのファイルディスクリプタは、シーケンシャルタイプのに関わらず、です。あなたは、通常のデータファイルを開いた場合、私は意味し、その後、タイマーファイルディスクリプタを作成し、その後、信号ファイルディスクリプタ、それらはすべて順番に番号が付けされることが保証されていますか?
あんまり。
私の知る限りでは、新fdを作成する呼び出しは、常に最も低い番号利用できるFDを返します。この動作に依存している古いプログラムがあります。前にdup2
存在していた、私は新しいファイルに標準入力を移動するための受け入れられた方法があったと考えていますclose(0); open("myfile", ...);
。
しかし、それは本当に確かFDSが使用可能なことするのは難しいです。例えば、ユーザはとしてあなたのプログラムを実行した可能性があります/usr/bin/prog 5>/some/file/somewhere
し、それはそのFD 5はスキップ取得表示されます、ので、/some/file/somewhere
そのようにFD 5に既に開かれていますが、連続してたくさんのファイルを開いた場合、あなたは本当にていることを確認して、あなたすることはできませんあなただけのすべてのそれらのFDSを自分で閉じて、すべての低い番号のFDSは、すでに使用されていることを確信しているしていない限り、シーケンシャルFDSを取得します。そして、それをやってすることははるかにちょうど最初の場所でFDSを追跡するよりも手間(および潜在的な問題の発生源)のようです。