2013-03-12 7 views
9

私はソケットを持っています。他のプロセスが書き込むのを待って、select()を実行しています。 書き込みが終わると、データを読み込んで別のファイル記述子に書き出します。 私の質問は、ファイル記述子にソケットを橋渡しする方法がある場合、データが準備できたら自動的に他のファイル記述子に書き込まれますか?2つのファイル記述子の間でブリッジする

このように、私は使用しているバッファを投げ捨てて、システム内のスレッドを省略することができます。

+1

なぜあなたを行います今すぐスレッドが必要ですか? – hyde

+0

あなたは解決しようとしている問題を説明できますか?パイプは、特定のストリームからのみ、必要なものを正確に行います。問題はネットワーク固有ですか? –

+0

@MichaelFoukarakis私はレガシーコードでデーモンのロギング環境を開発しています。私は実装を変更することはできません。とにかく、パイプは同じプロセスコンテキストでのみ動作しますが、それは私のためには機能しません。 – stdcall

答えて

4

申し訳ありませんあなたの状況を誤解していますが、sendfileのようなものですか?

のsendfile - 一つのファイル記述子と他の間でのファイル記述子との間の転送データが

#include <sys/sendfile.h> 
ssize_t sendfile(int out_fd, int in_fd, off_t * offset ", size_t" " count"); 

のsendfile()データをコピーします。このコピーはカーネル内で行われるため、sendfile()はread(2)とwrite(2)の組み合わせより効率的です。これはユーザー空間との間でデータをやりとりする必要があります。

+0

+1、彼はそれが欲しいと思う。 – StarPinkER

+4

リンクされたマニュアルページのスニペット:in_fd引数は、mmap(2)のような操作をサポートするファイルに対応していなければなりません(つまり、ソケットにすることはできません)* – hyde

+0

sendfileはかなり速いです... –

6

Linuxの場合、splice()を使用すると、ソケットからファイルに向かう場合がより適しています。 splice()を使用するのはもう少し複雑ですが、両方向になります。また、最近sendfileはスプライスinternallyを使用していると思います。

すでにsplice()とsendfile()の違いについて議論しているので、多くの疑問があります。ウェブを検索することで、スプライスが何のために(ソースと宛先)の矛盾するステートメントが明らかになります。あなたのケースに適しているかどうかを知る最も良い方法は、それをテストすることです。

SOに関する互換ファイルシステム:Does Linux's splice(2) work when splicing from a TCP socket?

スプライスを説明:SO TCPソケット用スプライスをサポートしていない古いカーネルについてWhich file systems support splicing via Linux's splice(2)?

http://kerneltrap.org/node/6505

スプライスソース: http://lxr.linux.no/#linux+v3.8.2/fs/splice.c

関連する問題