2010-04-05 8 views
5

Quería probar el syscall de empalme. Tengo esta función - debe copiar el contenido de un archivo a otro:Argumento no válido al llamar a 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); 
       } 
     } 
} 

La segunda llamada a empalmar en la primera iteración devuelve EINVAL (argumento no válido a partir perror) cada vez que - lo que podría ser la razón?

+0

¿Qué tipo de sistema (s) de archivos son sus archivos? – Duck

+0

Ambos ext3, pero también intenté leer desde/dev/zero y escribir en/dev/null con el mismo error. –

+4

Acabo de resolverlo - Abrí el archivo usando fopen con el modo "a +" - cuando cambié a "w" - funcionó. –

Respuesta

-1

no tengo ni idea de si esta es la mejor manera de hacer esto, pero esto funciona para mí:

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

Se crea un hilo para leer y otro para la escritura. Esto puede ser innecesario. El hilo de escritura solo parece requerir una llamada de empalme(), pero el lector hace aproximadamente cada 64k en mi sistema.

Lo anterior se probó en Fedora 13 x86_64 y parece ser capaz de copiar archivos larg (ish).

1

De splice(2): comentario

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

de OP indicó que abrió el archivo en modalidad de apertura.

Cuestiones relacionadas