调用linux splice时无效的参数()

调用linux splice时无效的参数()

问题描述:

我想尝试splice系统调用。我有这样的功能 - 它应该将一个文件的内容复制到另一个:调用linux splice时无效的参数()

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); 
       } 
     } 
} 

第二个电话在第一次迭代拼接(从PERROR无效参数)将返回EINVAL每次 - 可能是什么原因?

+0

你的文件是什么类型的文件系统? – Duck 2010-04-05 19:03:22

+0

这两个ext3,但我也尝试从/ dev/zero读取,并写入/ dev/null与相同的错误。 – 2010-04-05 19:08:07

+4

我刚刚解决了它 - 我打开文件使用fopen模式“a +” - 当更改为“w” - 它的工作。 – 2010-04-05 19:17:19

我不知道这是否是这样做的最佳方式,但是这对我的作品:

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

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

以上是在Fedora 13 x86_64上测试的,似乎可以复制larg(ish)文件。

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的评论指出,他开设了追加模式的文件。