12

ファイル記述子がシーク可能かどうかを判断する移植可能な方法 (POSIX システム上) はありますか? 私の考えではlseek(fd, 0, SEEK_CUR);、戻り値が-1であるかどうかを使用して確認することですが、これが偽陰性または偽陽性を与える可能性があるかどうかはわかりません。どのタイプのファイルがシーク可能/シーク不可であるかについて仮定を使用しfstatたり作成したりすることは、良い考えのようには思えません。他のアイデアはありますか?

4

2 に答える 2

10

lseek方法は合理的と思われる。確かに、偽陰性を引き起こすことはありません。もしそうなら、実装に深刻な問題があります。また、POSIX仕様によると、記述子がパイプ、FIFO、またはソケットの場合は失敗するはずなので、理論的には誤検知もありません。残っている唯一の問題は、さまざまなシステムが仕様にどれだけ準拠しているかです。ただし、他の方法が何であれ、これよりも確実に移植性が低くなるようです。

于 2010-07-13T15:51:42.813 に答える
5

fstat() を使用してから、stat 構造体のモード フィールドで S_ISREG マクロを使用して、それが通常のファイルかどうかを確認できます。定義ごとに、通常のファイルはシーク可能ですが、「非通常」(特別な)ファイルはシークできない場合があります(シーク可能な特別なファイルがあるかどうかはわかりません)。

しかし、ええ、lseek() と errno == ESPIPE の戻り値をチェックすることも機能するはずです。原則として、シークできないデバイスに対する lseek() の効果は実装定義なので、鼻のデーモンに注意してください。

于 2010-07-13T16:07:12.700 に答える