2011-12-24 15 views
6

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

答えて

11

sendfileの制限についてはこれが正しいです。そして、はい、spliceが助けになるかもしれませんが、それは自明ではありません。spliceは、ソースファイル記述子またはターゲットファイル記述子の少なくとも1つがパイプであることを要求します。したがって、ソケットからプレーンなファイル記述子に直接spliceすることはできません。

概念的に、あなたはそれを動作させるために何ができるかです:

  • セットアップは、あなたのインバウンドソケットFDと出力ファイルのFD普段
  • がループにpipe(2)
  • とのパイプを作成して:パイプの読み出し側から番目にsplice
  • ライト付きパイプの書き込み側にソケットから読み出さ
    • spliceれた電子ファイルも

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

Zero-Copy in Linux with sendfile() and splice()には、この手法の実装があります。

+3

2.6.33以降、sendfileのout_fdには、ソケットだけでなく、任意のファイル記述子を使用できます。 – ldrg

+1

4.2スプライス()の場合と同じです。 – technosaurus

関連する問題