2012-12-27 16 views
5

Ich erstelle Dateien 1.txt2.txt und schreibe etwas Inhalt in 1.txt.
Dann verwende ich den folgenden Code und möchte den Inhalt zu 2.txt kopieren.
Aber es funktioniert nicht. Es gibt nichts in 2.txt.sendfile kopiert keine Dateiinhalte

Können Sie meinen Fehler erklären?

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

Dieses markiert ist 'c', aber deutlich C++ Streams verwenden. Tu das nicht. – unwind

+0

In C++ verschoben. ;) –

+0

Da ich die Linux C API - "sendfile" verwende, habe ich "C" getauft. Und ich werde darauf achten. Danke! – Tengchao

Antwort

5

Nach man, die Signatur

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

So ist der erste Parameter ist der Dateideskriptor in die Sie schreiben möchten und die zweite ist die Dateideskriptor Sie lesen wollen .

So sollte Ihr Anruf sein:

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

+0

Sie sollten die Reihenfolge von 'fd2' und' fd1' in 'sendfile' umkehren. – banuj

+1

wäre es viel klarer, wenn Sie aussagekräftige Variablennamen verwenden. Z.B. in_file, out_file wäre viel einfacher zu erkennen, dass sie falsch herum sind. –

+0

OK, so ein einfacher Fehler, danke! – Tengchao

0

Per sendfile Prototyp, der fd, dem Sie den ersten Parameter schreiben sollte und sein fd von dem man liest sollte der zweite Parameter sein. Aber Sie haben es genau umgekehrt benutzt.

Also, Sie sendfile-Anweisung sollte wie unten sein:

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