2010-04-05 12 views
5

Volevo provare lo splice syscall. Ho questa funzione - dovrebbe copiare il contenuto di un file all'altro:Argomento non valido quando si chiama 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 seconda chiamata a unire in prima iterazione restituisce EINVAL (argomento non valido da perror) ogni volta - quello che potrebbe essere il motivo?

+0

Che tipo di file system sono i tuoi file? – Duck

+0

Entrambi ext3, ma ho anche provato a leggere da/dev/zero e scrivere a/dev/null con lo stesso errore. –

+4

L'ho appena risolto - Ho aperto il file usando fopen con la modalità "a +" - quando cambiato in "w" - funzionava. –

risposta

-1

ho idea se questo è il modo migliore di fare questo, ma questo funziona per me:

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

Si crea un thread per leggere e un altro per la scrittura. Questo potrebbe non essere necessario. Il thread di scrittura sembra richiedere solo una chiamata splice(), ma il lettore esegue approssimativamente ogni 64k sul mio sistema.

Quanto sopra è stato testato su Fedora 13 x86_64 e sembra essere in grado di copiare file larg (ish).

1

Da splice(2): commento

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

di OP ha indicato che ha aperto il file in modalità accodamento.