【发布时间】:2012-01-27 09:59:09
【问题描述】:
sendfile() 可用于将数据从“文件”描述符传输到“套接字”描述符,以便从机器 A 获取数据到机器 B。是否可以从“ socket”描述符到具有类似零拷贝语义的文件?我认为sendfile() 在这里没有帮助,因为sendfile() 需要数据源是“页面/缓冲区”缓存。我的理解正确吗? splice() 可以在这种情况下提供帮助吗?
【问题讨论】:
sendfile() 可用于将数据从“文件”描述符传输到“套接字”描述符,以便从机器 A 获取数据到机器 B。是否可以从“ socket”描述符到具有类似零拷贝语义的文件?我认为sendfile() 在这里没有帮助,因为sendfile() 需要数据源是“页面/缓冲区”缓存。我的理解正确吗? splice() 可以在这种情况下提供帮助吗?
【问题讨论】:
您对sendfile 的限制是正确的。是的,splice 可以提供帮助,但这并非微不足道:splice 要求至少有一个源文件描述符或目标文件描述符是管道。所以你不能直接splice从一个socket到一个普通的文件描述符。
从概念上讲,您可以做的事情是:
重复最后的步骤,直到读取所有数据。
【讨论】:
splice() 也是如此
splice() 的手册页仍然说 fd_in 或 fd_out 需要是一个管道。你有参考吗?