调用linux splice()时参数无效

时间:2010-04-05 18:57:05

标签: c linux system-calls 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 );
                }
        }
}

第一次迭代中对splice的第二次调用每次都返回EINVAL(来自perror的无效参数) - 可能是什么原因?

2 个答案:

答案 0 :(得分:1)

来自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的评论表明他以追加模式打开了文件。

答案 1 :(得分:-1)

我不知道这是否是最好的方法,但这对我有用:

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

它创建一个要读取的线程,另一个用于写入。这可能是不必要的。写入线程似乎只需要一个splice()调用,但读取器大约每隔64k执行一次。

上述内容在Fedora 13 x86_64上进行了测试,似乎可以复制larg(ish)文件。