2010-04-05 15 views
5

Ich wollte den Splice-Syscall ausprobieren. Ich habe diese Funktion - es sollte Inhalt einer Datei in eine andere kopieren:Ungültiges Argument beim Aufruf von 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); 
       } 
     } 
} 

Der zweite Anruf in der ersten Iteration spleißbar kehrt EINVAL (ungültiges Argument von perror) jedes Mal - was könnte der Grund sein?

+0

Welche Art von Dateisystem (en) sind Ihre Dateien? – Duck

+0

Beide ext3, aber ich habe auch versucht, von/dev/zero zu lesen und mit demselben Fehler in/dev/null zu schreiben. –

+4

Ich habe es gerade gelöst - ich öffnete die Datei mit fopen mit Modus "a +" - wenn auf "w" geändert - es hat funktioniert. –

Antwort

-1

Ich habe keine Ahnung, ob dies der beste Weg, dies zu tun, aber das funktioniert für mich:

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

Es einen Thread erstellt für das Schreiben zu lesen und zu anderen. Dies kann unnötig sein. Der schreibende Thread scheint nur einen splice() -Aufruf zu benötigen, aber der Leser führt ungefähr alle 64k auf meinem System aus.

Das obige wurde auf Fedora 13 x86_64 getestet und scheint Larg (ish) Dateien zu kopieren.

1

Von 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 Kommentar an, dass er die Datei im Append-Modus geöffnet.

Verwandte Themen