splice系统调用的man页面指出,如果以下情况之一发生,
splice
可能会失败并将errno
设置为EINVAL
:
目标文件系统不支持splice;两个描述符中没有一个是pipe;或者针对不可寻址设备给出偏移量。
哪些文件系统支持splice?
splice
可能会失败并将errno
设置为EINVAL
:
目标文件系统不支持splice;两个描述符中没有一个是pipe;或者针对不可寻址设备给出偏移量。
哪些文件系统支持splice?
我的原始回答部分不正确,这是一个重大改写。
在 Linux 2.6.30.10 和更早版本中,splice
在源文件系统或目标文件系统不支持 splicing 时会返回 EINVAL
。以下是支持 splicing 的文件系统:
详情请参见:do_splice_to()
函数中“文件到管道”情况下和 do_splice_from()
函数中“管道到文件”情况下,对 splicing 的支持是如何确定的。这是通过检查相关的 struct file_operations
是否包含 .splice_read
和 .splice_write
来完成的。我为了产生上述文件系统列表,已经通过 fs/*/file.c
中的 .splice_read
和 .splice_write
进行了 grepped 搜索。
从Linux 2.6.31开始,所有的文件系统都支持读写模式下的splice操作
详细情况如下:当文件系统的struct file_operations
中没有.splice_read
或.splice_write
时,会使用回退函数default_file_splice_read
和default_file_splice_write
。请参见do_splice_to()
和do_splice_from()
以了解实现细节。注意:文档中列出的其他原因仍可能导致返回EINVAL
错误。