10

sendfile()マシンAからマシンBにデータを取得するために、「ファイル」記述子から「ソケット」記述子にデータを送信するために使用できます。受信側で「ソケット」記述子からファイルにデータを取得することは可能ですか同様のゼロコピーセマンティクスを使用しますか? データのソースを「ページ/バッファ」キャッシュにする必要があるsendfile()ため、ここでは役に立たないと思います。sendfile()私の理解は正しいですか?splice()この状況で助けることができますか?

4

1 に答える 1

16

このための制限については正しいですsendfile。はい、splice役に立ちますが、簡単ではありません。spliceソースまたはターゲットのファイル記述子の少なくとも 1 つがパイプである必要があります。spliceしたがって、ソケットからプレーン ファイル記述子に直接変換することはできません。

概念的には、それを機能させるためにできることは次のとおりです。

  • 通常どおり、受信ソケット fd と出力ファイル fd をセットアップします。
  • でパイプを作るpipe(2)
  • ループで:
    • ソケットからパイプの書き込み側に読み取りますsplice
    • また、パイプの読み取り側からファイルに書き込みspliceます

すべてのデータが読み取られるまで、最後の手順を繰り返します。

sendfile() と splice() を使用した Linux のゼロコピーには、この手法が実装されています。

于 2011-12-24T19:08:33.143 に答える