调用linux splice()时参数无效

我想尝试拼接系统调用。 我有这个function – 它应该复制一个文件的内容到另一个:

static void test_splice( int in, int out ) { int i = 0, rcvd = 0; int filedes[2]; off_t off = 0; if ( pipe( filedes ) < 0 ) { perror( "Kicha pipe" ); exit( EXIT_FAILURE ); } for ( i = 0; i < NUMLOOPS; ++i ) { if ( ( rcvd = splice( in, NULL, filedes[1], NULL, BUFSIZE, SPLICE_F_MORE | SPLICE_F_MOVE ) ) < 0 ) { perror( "splice" ); exit( EXIT_FAILURE ); } if ( splice( filedes[0], NULL, out, NULL, rcvd, SPLICE_F_MORE | SPLICE_F_MOVE ) < 0 ) { perror( "splice" ); exit( EXIT_FAILURE ); } } } 

在第一次迭代的第二次拼接返回EINVAL(从perror无效的参数)每次 – 可能是什么原因?

splice(2)

 ERRORS ... EINVAL Target filesystem doesn't support splicing; target file is opened in append mode; neither of the file descriptors refers to a pipe; or offset given for nonseekable device. ... 

OP的评论表明他以追加模式打开文件。

我不知道这是否是这样做的最好方法,但这对我来说是有效的:

http://vectrex.org.uk/mark/splicecopy.cpp

它创建一个线程读取和另一个写作。 这可能是不必要的。 写作线程似乎只需要一个splice()调用,但读者在我的系统上大约每64k就做一次。

以上是在Fedora 13 x86_64上进行测试,似乎能够复制larg(ish)文件。