2012-12-27 21 views
5

Creo i file 1.txt2.txt e scrivi del contenuto in 1.txt.
Quindi io uso il codice qui sotto e voglio copiare il contenuto in 2.txt.
Ma non funziona. Non c'è nulla in 2.txt.sendfile non copia il contenuto del file

Puoi spiegare il mio errore?

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

Questo è etichettato 'c', ma è chiaro che utilizzando i flussi C++. Non farlo. – unwind

+0

Trasferito in C++. ;) –

+0

Perché uso l'API C linux - "sendfile", così ho organizzato "C". E presterò attenzione a questo. Grazie! – Tengchao

risposta

5

Secondo man, la firma è

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

Così, il primo parametro è il descrittore di file in che si desidera scrivere e il secondo è il descrittore di file che si desidera leggere da .

Quindi, la chiamata dovrebbe essere:

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

+0

Dovresti invertire l'ordine di 'fd2' e' fd1' in 'sendfile'. – banuj

+1

sarebbe MOLTO più chiaro se si usano variabili variabili. Per esempio. in_file, out_file sarebbe molto più facile individuare che sono nel modo sbagliato. –

+0

OK, un errore così semplice, grazie! – Tengchao

0

Come da sendfile prototipo, il fd a cui si desidera scrivere dovrebbe essere il primo parametro e fd dal quale si legge dovrebbe essere il secondo parametro. Ma tu l'hai usato esattamente nel modo opposto.

Quindi, si dichiarazione sendfile dovrebbe essere come di seguito:

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