特定の種類の擬似ファイル(procfsやsysfs仮想ファイルシステムの多くの擬似ファイルなど)にはファイルサイズがなく(stat
return == 0)、サポートされていst_size
ません。通常のランダムアクセスファイルよりFIFO。残念ながら、彼らはファイルタイプについても嘘をつきました。彼らのフィールドにはビットが含まれています。これはビットではなく通常のファイルを意味します。SEEK_END
fseek
/proc/cpuinfo
st_mode
S_IFREG
S_IFIFO
これにより、データを「よりスマートに」管理しようとする入力コードに問題が発生し、ファイルを表示する/proc/*
とツールがクラッシュするという報告がたくさんあります。
私は、ユーザーが指定したさまざまなソースからストリームを取得できる一般的なストリーム入力システムを備えたこれらのツールの1つを開発しています。さらに、シーケンシャルな「シーケンシャル」パイプやソケットなどのランダムアクセスストリームを処理でき、それに使用されるのと同じテクノロジがprocfs / sysfs /その他の仮想ファイルシステムオブジェクトに対して機能します。一つを見ると。
FILEポインタ、ファイル記述子、またはファイルパス名が与えられた場合、Cはこれらの問題のある疑似ファイルオブジェクトの1つを見ているかどうかをどのように判断できますか? (注:ファイルシステムをランダムにマウントできるため、/ procで始まるパスを確認するだけでは不十分です。ファイルの合計をst_size
信頼できるかどうかを知らせるOSが必要ですSEEK_END
。)現代の合理的に移植可能なソリューションありますか? *違う?
(これはプログラミングに関する質問です。必要に応じて自由にSOに移動してください。)
ベストアンサー1
ファイル記述子を使用し、報告された結果のサイズが0のstat
場合、ファイルが空であるか、サイズが不明です。ファイルが空の場合、ゲームをプレイするときにファイルをより効率的に読み取ることはあまり意味がありません。
したがって、サイズがわからない場合は、代替コードパスを使用する必要があり、ファイルが空であっても問題になりません。
ファイル名だけでファイル形式を診断することは、餌やコンバージョン攻撃(またはバグ)にさらされる可能性があるため、注意する必要があります。ファイルを正常に開くまで何も見つけようとしないでください。名前がファイルに関連付けられていない可能性があるため、名前ではなくファイル記述子を直接的または間接的に使用する必要があります。同じファイル。
お役に立てば幸いです。