- 最後登錄
- 2024-3-26
- 在線時間
- 0 小時
- 註冊時間
- 2011-6-20
- 閱讀權限
- 20
- 精華
- 0
- UID
- 9919445
- 帖子
- 43
- 積分
- 26 點
- 潛水值
- 8870 米
| 對一般熟悉 Linux TCP/IP socket programming 的programmer來說,要做file transfe的工作最常使用的方法就是用open()將要傳送的file打開, , 然後用read()藉由open()所產生的file descriptor將讀到的 內容copy到 buffer 然後用write()藉由 socket() 所產生的file descriptor 將 buffer 的內容 透過 TCP/IP protocol傳輸到目的. 所以程式都將有類似的 routine: do_read(file_fd,buffer,len) - 讀file 內容的routine . do_write(socket_fd,buffer,len) - socket 傳輸 routine. 由於 read() , write() 皆是在 user space 的 system call, 程式執行時 read() ,write() 均須將相同 buffer 的內容copy 進出 kernel space , 這不是一個非常有效率的方法, 尤其是當傳輸的檔案size相當大時 ( > 1 Gbyte) , 程式執行時間也會較久. Linux 提供了另一個選擇 - sendfile 它號稱是所謂的 zero-copy, 就是sednfile system call 本身無需做buffer copy 進出 kernel space 的動作, 既能將 讀到的buffer 內容藉由 socket 傳輸到目的地, 可減少程式執行時間. 請參考附件的範例.... |
附件: 你需要登錄才可以下載或查看附件。沒有帳號?註冊 |