7

を使用して、データをファイル記述子(通常のファイル、charまたはblockデバイス、FIFO、またはで開くことができるもの)spliceにゼロコピーしたいと思います。を使用するには、fromファイル記述子またはtoファイル記述子のいずれかがパイプの適切な端である必要があるため、通常、プログラマーが非パイプから非パイプにデータをゼロコピーする場合は、中間バッファーとして機能するパイプが作成されます。 -パイプ。ただし、がすでにパイプの読み取り端である場合は、その手順をスキップして、他のファイル記述子から直接スプライスを試みることができます。したがって、パイプの読み取り端であるかどうかを判断できるようにしたいと思います。STDIN_FILENOopenspliceSTDIN_FILENOSTDIN_FILENOSTDIN_FILENO

STDIN_FILENOパイプの読み取り側かどうかを判断できるLinuxシステムコールはありますか?

4

2 に答える 2

8

開いているfdに関する情報を取得するには、fstat()を使用できます。結果のst_modeは、パイプの場合はS_IFIFOである必要があると思います。または、/ proc / self /fd/および/proc/ self / fdinfo /は、ファイル記述子に関する情報も提供します。/procはLinux固有であることに注意してください。

ただし、最初にsplice()を使用してみて、失敗した場合(EINVALで?)は魔法に戻った方が簡単かもしれません。

于 2010-09-03T22:38:00.947 に答える
2

別の方法として、「fdがパイプ、ソケット、またはFIFOに関連付けられている」場合lseek()は失敗します。ESPIPEしたがって、no-oplseek(fd, 0, SEEK_CUR)は、ファイル記述子がこれらのいずれかであるかどうかを示します。

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

于 2015-02-27T21:23:34.127 に答える