sendfile()マシンAからマシンBにデータを取得するために、「ファイル」記述子から「ソケット」記述子にデータを送信するために使用できます。受信側で「ソケット」記述子からファイルにデータを取得することは可能ですか同様のゼロコピーセマンティクスを使用しますか? データのソースを「ページ/バッファ」キャッシュにする必要があるsendfile()ため、ここでは役に立たないと思います。sendfile()私の理解は正しいですか?splice()この状況で助けることができますか?
8742 次
1 に答える
16
このための制限については正しいですsendfile。はい、splice役に立ちますが、簡単ではありません。spliceソースまたはターゲットのファイル記述子の少なくとも 1 つがパイプである必要があります。spliceしたがって、ソケットからプレーン ファイル記述子に直接変換することはできません。
概念的には、それを機能させるためにできることは次のとおりです。
- 通常どおり、受信ソケット fd と出力ファイル fd をセットアップします。
- でパイプを作る
pipe(2) - ループで:
- ソケットからパイプの書き込み側に読み取ります
splice - また、パイプの読み取り側からファイルに書き込み
spliceます
- ソケットからパイプの書き込み側に読み取ります
すべてのデータが読み取られるまで、最後の手順を繰り返します。
sendfile() と splice() を使用した Linux のゼロコピーには、この手法が実装されています。
于 2011-12-24T19:08:33.143 に答える