Как я могу написать 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?

0 ответов

Другие вопросы по тегам