fseek()
パイプでは機能しないため、前方シークをシミュレートするためにどのような方法が存在しますか? 素朴なアプローチはfread()
、メモリ バッファに読み込まれた内容を使用して破棄することです。巨大なバッファを回避するための巨大なシークでは、バッファの一部だけを使用して、最終的な読み取りで同じバッファを何度も使用します。
しかし、これが唯一のアプローチですか?バッファと潜在的な複数読み取りを回避する別の方法はありますか?
入力は動的に生成される (ディスクに保存されない) ため、シークはパイプでは意味がありません。カーネル システム コールは、lseek
パイプには実装されていません。
また、パイプは本質的に、限定された固定サイズのプロデューサー/コンシューマー バッファーであることにも注意してください。いっぱいになると、プロデューサーはコンシューマーが最も古いデータを読み取るまで中断されます。
はい、それが唯一の方法です。1k から 8k 程度のバッファを使用します。はるかに小さいと、読み取りの syscall オーバーヘッドが発生し、はるかに大きいと、キャッシュから有用なデータが削除されます。