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
?