2010-04-05 4 views
5

Je voulais essayer le syscall d'épissage. J'ai cette fonction - il doit copier le contenu d'un fichier à un autre:Argument invalide lors de l'appel de l'épissure linux()

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); 
       } 
     } 
} 

Le deuxième appel à épissures dans la première itération renvoie EINVAL (argument invalide de perror) à chaque fois - ce qui pourrait être la raison?

+0

De quel type de système de fichiers disposez vos fichiers? – Duck

+0

Les deux ext3, mais j'ai aussi essayé de lire/dev/zero et écrire dans/dev/null avec la même erreur. –

+4

Je viens de le résoudre - J'ai ouvert le fichier en utilisant fopen avec le mode "a +" - lorsqu'il a été changé en "w" - cela a fonctionné. –

Répondre

-1

Je ne sais pas si cela est la meilleure façon de le faire, mais cela fonctionne pour moi:

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

Il crée un fil à lire et un autre pour l'écriture. Cela peut être inutile. Le thread d'écriture semble seulement exiger un appel splice(), mais le lecteur fait environ tous les 64k sur mon système.

Ce qui précède a été testé sur Fedora 13 x86_64 et semble pouvoir copier des fichiers larg (ish).

1

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

commentaire OP a indiqué qu'il a ouvert le fichier en mode append.

Questions connexes