2011-12-24 36 views
6

sendfile() có thể được sử dụng để truyền dữ liệu từ bộ mô tả "tệp" đến bộ mô tả "socket" để lấy dữ liệu từ máy A đến máy B. Có thể lấy dữ liệu tại đầu nhận từ bộ mô tả "socket" đến một tệp có ngữ nghĩa không sao chép tương tự? Tôi nghĩ rằng sendfile() không giúp đỡ ở đây vì sendfile() cần nguồn dữ liệu là bộ đệm "trang/bộ đệm". Tôi hiểu có đúng không? Có thể giúp splice() trong tình huống này không?Tìm hiểu về sendfile() và splice()

Trả lời

11

Bạn chính xác về giới hạn của sendfile cho việc này. Và có, splice có thể giúp, nhưng nó không tầm thường: splice yêu cầu ít nhất một trong các bộ mô tả tệp nguồn hoặc đích là một đường ống. Vì vậy, bạn không thể trực tiếp splice từ một ổ cắm đến một bộ mô tả tệp đơn giản.

Về mặt lý thuyết, những gì bạn có thể làm để làm cho nó hoạt là:

  • thiết lập ổ cắm fd trong nước và đầu ra tập tin fd của bạn như bạn sẽ thường
  • tạo ra một đường ống với pipe(2)
  • trong một vòng lặp :
    • đọc từ ổ cắm sang bên ghi của ống với splice
    • ghi từ phía đọc của ống để th tập tin e với splice cũng

Lặp lại các bước cuối cùng cho đến khi tất cả các dữ liệu được đọc.

Zero-Copy in Linux with sendfile() and splice() có triển khai kỹ thuật này.

+3

Vì 2.6.33 out_fd cho tệp gửi có thể là bất kỳ bộ mô tả tệp nào (không chỉ ổ cắm). – ldrg

+1

kể từ 4,2 tương tự với 'splice()' – technosaurus

Các vấn đề liên quan