2012-12-27 41 views
5

Tôi tạo tệp 1.txt2.txt và viết một số nội dung vào 1.txt.
Sau đó, tôi sử dụng mã bên dưới và muốn sao chép nội dung sang 2.txt.
Nhưng nó không hoạt động. Không có gì trong số 2.txt.sendfile không sao chép nội dung tệp

Bạn có thể giải thích sai lầm của mình không?

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

này được gắn thẻ 'c', nhưng rõ ràng sử dụng dòng C++. Đừng làm thế. – unwind

+0

Đã chuyển sang C++. ;) –

+0

Bởi vì tôi sử dụng API C Linux - "sendfile", vì vậy tôi đã ghi "C". Và tôi sẽ chú ý đến điều này.Cảm ơn bạn! – Tengchao

Trả lời

5

Theo man, chữ ký là

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

Vì vậy, tham số đầu tiên là mô tả tập tin vào mà bạn muốn viết và điều thứ hai là mô tả tập tin bạn muốn đọc từ .

Vì vậy, cuộc gọi của bạn nên là:

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

+0

Bạn nên đảo ngược thứ tự của 'fd2' và' fd1' trong 'sendfile'. – banuj

+1

nó sẽ là MUCH rõ ràng hơn nếu bạn sử dụng variablenames có ý nghĩa. Ví dụ. in_file, out_file sẽ dễ dàng hơn nhiều để phát hiện ra rằng chúng là sai đường xung quanh. –

+0

OK, một sai lầm đơn giản như vậy, cảm ơn bạn! – Tengchao

0

Theo sendfile nguyên mẫu, các fd mà bạn muốn viết nên là tham số đầu tiên và fd mà từ đó người ta đọc nên tham số thứ hai. Nhưng, bạn đã sử dụng nó theo cách ngược lại hoàn toàn.

Vì vậy, bạn tuyên bố sendfile nên như sau:

ssize_t size = sendfile(fd2,fd1,0,stat_buf.st_size); 
Các vấn đề liên quan