読み取り可能なファイル記述子がパイプの読み取り端であるかどうかを判断する
-
30-09-2019 - |
質問
使いたいです 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)
ファイル記述子がこれらのいずれかであるかどうかを教えてくれます。
私の状況では、これは私が興味を持っていたすべてのケースをカバーしています。