2012-12-27 25 views
5

मैं 1.txt2.txt फ़ाइलें और 1.txt में कुछ सामग्री लिखता हूं।
फिर मैं नीचे दिए गए कोड का उपयोग करता हूं और सामग्री को 2.txt पर कॉपी करना चाहता हूं।
लेकिन यह काम नहीं करता है। 2.txt में कुछ भी नहीं है।sendfile फ़ाइल सामग्री की प्रतिलिपि नहीं करता

क्या आप मेरी गलती को समझा सकते हैं?

int main() 
{ 
    int fd1 = open("1.txt",O_RDWR); 
    int fd2 = open("2.txt",O_RDWR);   
    struct stat stat_buf ; 
    fstat(fd1,&stat_buf); 
    ssize_t size = sendfile(fd1,fd2,0,stat_buf.st_size); 
    cout<<"fd1 size:"<<stat_buf.st_size<<endl; //output 41 
    cout<<strerror(errno)<<endl; //output success 

    close(fd1); 
    close(fd2); 
    return 0; 
} 
+0

इस टैग है 'सी' है, लेकिन स्पष्ट रूप से सी ++ धाराओं का इस्तेमाल करके। ऐसा मत करो। – unwind

+0

सी ++ में ले जाया गया। ;) –

+0

क्योंकि मैं लिनक्स सी एपीआई - "sendfile" का उपयोग करता हूं, इसलिए मैंने "सी" को टाटा। और मैं इस पर ध्यान देना चाहूंगा.धन्यवाद! – Tengchao

उत्तर

5

man के अनुसार, हस्ताक्षर

ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);

तो है, पहली पैरामीटर फाइल की जानकारी देता है में आप लिखना चाहते हैं और दूसरा एक फ़ाइल वर्णनकर्ता आप से पढ़ने के लिए चाहते हैं ।

तो, अपने कॉल किया जाना चाहिए:

ssize_t size = sendfile(fd2,fd1,0,stat_buf.st_size);

+0

आपको 'sendfile' में' fd2' और 'fd1' के क्रम को उलट करना चाहिए। – banuj

+1

यदि आप सार्थक variablenames का उपयोग करते हैं तो यह बहुत स्पष्ट होगा। उदाहरण के लिए। in_file, out_file यह पता लगाने के लिए बहुत आसान होगा कि वे गलत तरीके से हैं। –

+0

ठीक है, ऐसी सरल गलतियों, धन्यवाद! – Tengchao

0

प्रति sendfile प्रोटोटाइप के रूप में, एफडी, जिस पर आप लिखने के लिए पहले पैरामीटर और fd जहाँ से पढ़ता दूसरा पैरामीटर होना चाहिए चाहते हैं। लेकिन, आपने इसे बिल्कुल विपरीत तरीके से उपयोग किया है।

तो, आप Sendfile बयान के रूप में नीचे होना चाहिए:

ssize_t size = sendfile(fd2,fd1,0,stat_buf.st_size);