読み取り可能なファイル記述子がパイプの読み取り端であるかどうかを判断する

StackOverflow https://stackoverflow.com/questions/3639454

質問

使いたいです splice ゼロコピーデータから STDIN_FILENO ファイル記述子(通常のファイル、charまたはblockデバイス、FIFO、またはで開くことができるものになる可能性があります open)。使用するために splice, 、どちらか から ファイル記述子または ファイル記述子はパイプの適切な端である必要があるため、通常、プログラマーがパイプ以外からパイプまでのデータをゼロコピーする必要がある場合、パイプが中間バッファとして機能するように作成されます。ただし、場合 STDIN_FILENO すでにパイプの読み取り端であり、そのステップをスキップして直接スプライスしようとすることができます STDIN_FILENO 他のファイル記述子に。したがって、私は STDIN_FILENO パイプの読み取り端です。

Linuxシステムコールは、 STDIN_FILENO パイプの読み取り端はありますか?

役に立ちましたか?

解決

オープンFDに関する情報を取得するには、fstat()を使用できます。結果のst_modeはパイプのs_ififoであるべきだと思います。または、/proc/self/fd/and/proc/self/fdinfo/もファイル記述子に関する情報を提供します。 /procはLinux固有であることに留意してください。

ただし、最初にSplice()を使用しようとする方が簡単かもしれません。

他のヒント

代替として、 lseek() で失敗します ESPIPE 「FDがパイプ、ソケット、またはFIFOに関連付けられている場合。」だから、op lseek(fd, 0, SEEK_CUR) ファイル記述子がこれらのいずれかであるかどうかを教えてくれます。

私の状況では、これは私が興味を持っていたすべてのケースをカバーしています。

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