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
由于文档中列出的其他原因,可能仍会返回.