Неверный аргумент при вызове linux splice () - PullRequest
5 голосов
/ 05 апреля 2010

Я хотел попробовать системный вызов соединения. У меня есть эта функция - она ​​должна копировать содержимое одного файла в другой:

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 ]

1 голос
/ 29 мая 2016

С 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.
       ...    

Комментарий ОП показал, что он открыл файл в режиме добавления.

0 голосов
/ 11 октября 2010

Я понятия не имею, является ли это лучшим способом сделать это, но это работает для меня:

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

Создает один поток для чтения, а другой для записи. Это может быть ненужным. Кажется, что поток записи требует только одного вызова splice (), но читатель делает примерно каждые 64 КБ в моей системе.

Выше был протестирован на Fedora 13 x86_64 и, похоже, может копировать большие (ish) файлы.

...