0

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并且永远不会返回:sendsplice0

  • 循环spliceAll是否正确?

  • 是否还有其他我在spliceAll和中都没有看到的错误sendAll
4

0 回答 0