2012-12-27 13 views
5

Tworzę pliki 1.txt2.txt i zapisuję niektóre treści w 1.txt.
Następnie używam poniższego kodu i chcę skopiować zawartość do 2.txt.
Ale to nie działa. Nie ma niczego w 2.txt.sendfile nie kopiuje zawartości pliku

Czy możesz wyjaśnić mój błąd?

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

To jest oznaczone 'C', ale wyraźnie z użyciem strumieni C++. Nie rób tego. – unwind

+0

Przeniesiony do C++. ;) –

+0

Ponieważ korzystam z API C linux - "sendfile", więc użyłem "C". I zwrócę na to uwagę. Dziękuję! – Tengchao

Odpowiedz

5

Według man, podpis jest

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

Więc, pierwszy parametr jest deskryptor pliku do chcesz pisać, a drugi jest deskryptor pliku, który chcesz odczytać z .

Tak, połączenie powinno być:

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

+0

Powinieneś odwrócić kolejność 'fd2' i' fd1' w 'sendfile'. – banuj

+1

byłby DUŻO wyraźniejszy, jeśli używasz znaczących zmiennych zmiennych. Na przykład. in_file, out_file byłoby o wiele łatwiej dostrzec, że są one niewłaściwe. –

+0

OK, takie proste błędy, dziękuję! – Tengchao

0

Zgodnie sendfile prototypu, fd, do którego chcesz napisać powinny być pierwszy parametr i fd, z którego czyta powinien być drugi parametr. Ale użyłeś go dokładnie odwrotnie.

Więc sendfile oświadczenie powinno być jak poniżej:

ssize_t size = sendfile(fd2,fd1,0,stat_buf.st_size); 
Powiązane problemy