Как я могу написать spliceAll в Linux?
Я хочу слить канал, передав все его данные в сокет, используя 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
) А ТАКЖЕ send
& splice
никогда не возвращаясь 0
:
- Цикл в
spliceAll
правильный?
- Есть ли другие ошибки, которые я не вижу в обеих
spliceAll
а такжеsendAll
?