splice
系统调用的手册页说,如果出现以下情况, splice
可能会失败并将errno
为EINVAL
:
目标文件系统不支持拼接; 这两个描述符都不是指pipe道; 或给予不可search设备的偏移量
哪些文件系统支持拼接?
我原来的回答部分是不正确的,这是一个重大的改写。
在Linux 2.6.30.10和更旧版本中,当源或目标文件系统不支持拼接时, splice
返回EINVAL
。 以下是支持拼接的文件系统 :
详情如下。 支持在“文件到管道”情况下的do_splice_from()
函数和“管道到文件”情况下的do_splice_to()
函数中确定的拼接。 这是通过检查相关的struct file_operations
是否分别包含.splice_read
或.splice_write
完成的。 为了生成上面列出的文件系统,我已经为.splice_read
和.splice_write
grepped fs/*/file.c
.splice_write
从Linux 2.6.31开始, 所有的文件系统都支持在读写模式下进行拼接 。
详情如下。 当文件系统的struct file_operations
中没有.splice_read
或.splice_write
时,将使用一个回退函数:分别为default_file_splice_read
和default_file_splice_write
。 有关实现,请参阅do_splice_to()
和do_splice_from()
。 注意:由于文档中列出的其他原因, EINVAL
仍可能被退回。
根据这一点 ,EXT3呢。 看起来你可能没有使用任何FUSE文件系统。