5

splice syscall を試してみたかったのです。私はこの機能を持っています-あるファイルのコンテンツを別のファイルにコピーする必要があります:

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 を 2 回呼び出すと、毎回 EINVAL ( perror からの無効な引数) が返されます。その理由は何でしょうか?

4

2 に答える 2

-1

これがこれを行う最善の方法であるかどうかはわかりませんが、これは私にとってはうまくいきます:

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

読み取り用に 1 つのスレッドを作成し、書き込み用に別のスレッドを作成します。これは不要な場合があります。書き込みスレッドは splice() 呼び出しを 1 回だけ必要とするように見えますが、リーダーは私のシステムでは約 64k ごとに呼び出します。

上記は Fedora 13 x86_64 でテストされており、大きな (ish) ファイルをコピーできるようです。

于 2010-10-11T15:54:22.390 に答える