splice
Linux でシステム コールを使用してすべてのデータをソケットにプッシュすることにより、パイプを排出したいと考えています。
私の現在の試みは:
ssize_t splice(int i, loff_t* io, int o, loff_t* oo, size_t l, unsigned int flags);
int spliceAll(int i, loff_t* io, int o, loff_t* oo, size_t l, unsigned int flags) {
size_t t = 0; int n = 0;
while (t < l) { if ((n = splice(i, io, o, oo, l - t, flags)) < 0) break; t += n; }
return t == l ? 0 : -1;
}
これに相当するユーザー空間バッファーは次のとおりです。
int sendAll(int s, void* b, size_t l, int flags) {
size_t t = 0; int n = 0;
while (t < l) { if ((n = send(s, b + t, l - t, flags)) < 0) break; t += n; }
return t == l ? 0 : -1;
}
ノンブロッキング ソケット (および のパイプspliceAll
) AND send
&をsplice
決して返さないと仮定し0
ます。
- ループは
spliceAll
正しいですか?
- と の両方
spliceAll
で表示されない他のエラーはありsendAll
ますか?