select()
他のプロセスが書き込むのを待っているソケットがあります。書き込みが完了したら、データを読み取り、別のファイル記述子に書き込みます。私の質問は、ソケットをファイル記述子にブリッジする方法がある場合、データの準備ができたら、自動的に他のファイル記述子に書き込まれますか?
このようにして、使用しているバッファーをスローし、システム内のスレッドを省略することができます。
select()
他のプロセスが書き込むのを待っているソケットがあります。書き込みが完了したら、データを読み取り、別のファイル記述子に書き込みます。私の質問は、ソケットをファイル記述子にブリッジする方法がある場合、データの準備ができたら、自動的に他のファイル記述子に書き込まれますか?
このようにして、使用しているバッファーをスローし、システム内のスレッドを省略することができます。
Linuxでは、splice()
ソケットからファイルへの方向である場合は、を使用する方が適している場合があります。使用splice()
は少し複雑ですが、双方向になります。また、最近、sendfileは内部でスプライスを使用していると思います。
splice()とsendfile()の違いについては、SOについてすでに多くの質問があります。Webを検索すると、スプライスが何のために機能するか(ソースと宛先)に関する矛盾するステートメントも明らかになります。それがあなたのケースに適しているかどうかを知る最良の方法は、それをテストすることです。
互換性のあるファイルシステムについて:Linuxのsplice(2)を介したスプライシングをサポートしているファイルシステムはどれですか?
TCPソケットのスプライスをサポートしていない古いカーネルについて:Linuxのsplice(2)は、TCPソケットからスプライスするときに機能しますか?
スプライスの説明: http: //kerneltrap.org/node/6505
スプライスソース: http: //lxr.linux.no/#linux+v3.8.2/fs/splice.c
あなたの状況を誤解していたら申し訳ありませんが、次のような意味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) の組み合わせよりも効率的です。