Dan*_*ien 18 c linux filesystems splice zero-copy
系统调用的手册页splice说splice可能会失败并设置errno为EINVAL:
目标文件系统不支持拼接; 描述符都不是指管道; 或不可寻找设备的偏移量
哪些文件系统支持拼接?
Bol*_*olo 15
我的原始答案部分不正确,这是一个重大改写.
在Linux中2.6.30.10及以上,splice返回EINVAL时在源或目标文件系统不支持拼接.以下是支持拼接的文件系统:
细节如下.支持do_splice_to()在"文件到管道"情况和do_splice_from()"管道到文件"情况下的函数中确定的拼接.它是通过检查相关是否struct file_operations包含.splice_read或.splice_write分别完成的.为了生产文件系统的上述名单,我已经grepped fs/*/file.c的.splice_read和.splice_write.
从Linux 2.6.31开始,所有文件系统都支持在读取和写入模式下进行拼接.
细节如下.当文件系统没有.splice_read或.splice_write在其中时struct file_operations,使用回退函数:default_file_splice_read和default_file_splice_write.查看do_splice_to()和do_splice_from()实现.注意:EINVAL由于文档中列出的其他原因,可能仍会返回.