2010-04-05 9 views
5

पर कॉल करते समय अमान्य तर्क मैं splice syscall को आजमाने की कोशिश करता था। मैं इस समारोह है - यह एक से दूसरे फ़ाइल की सामग्री की नकल करना चाहिए:लिनक्स 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); 
       } 
     } 
} 

पहले चरण में ब्याह करने के लिए दूसरी कॉल (perror से अमान्य तर्क) रिटर्न EINVAL हर - क्या कारण हो सकता है?

+0

फाइल सिस्टम (ओं) पर अपनी फ़ाइलें हैं किस तरह का? – Duck

+0

दोनों ext3, लेकिन मैंने/dev/zero से पढ़ने और उसी त्रुटि के साथ/dev/null को पढ़ने का भी प्रयास किया। –

+4

मैंने इसे हल किया - मैंने "ए +" मोड के साथ फॉपेन का उपयोग करके फ़ाइल खोली - जब यह "डब्ल्यू" में बदल गया - यह काम करता था। –

उत्तर

-1

मैं पता नहीं है कि क्या यह ऐसा करने का सबसे अच्छा तरीका है, लेकिन यह मेरे लिए काम करता है: पढ़ने के लिए और लिखने के लिए किसी अन्य के लिए

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

यह एक धागा बनाता है। यह अनावश्यक हो सकता है। लेखन धागे को केवल एक splice() कॉल की आवश्यकता होती है, लेकिन पाठक मेरे सिस्टम पर लगभग हर 64k करता है।

उपर्युक्त फेडोरा 13 x86_64 पर परीक्षण किया गया था और यह बड़े पैमाने पर (आईएसएच) फ़ाइलों की प्रतिलिपि बनाने में सक्षम प्रतीत होता है।

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

ओपी की टिप्पणी संकेत दिया कि वह संलग्न मोड में फ़ाइल को खोला।