sendfile() - Unix、Linux系統呼叫 - 技術教學
Tutorials Point


  Unix入門
  Unix Shell程式設計
  高階Unix
  Unix有用參考
  Unix有用資源
  精選閱讀

版權所有 © 2014 tutorialspoint



  首頁     參考     討論區     關於TP  

sendfile() - Unix、Linux系統呼叫


previous next AddThis Social Bookmark Button

廣告

名稱

sendfile - 在檔案描述符之間傳輸資料

概要

#include <sys/sendfile.h>

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

描述

sendfile() 在一個檔案描述符和另一個檔案描述符之間複製資料。由於此複製操作在核心中完成,因此sendfile() 比read(2) 和write(2) 的組合效率更高,後者需要將資料傳輸到使用者空間和從使用者空間傳輸資料。

in_fd 應為開啟以供讀取的檔案描述符,而out_fd 應為開啟以供寫入的描述符。

如果offset 不為 NULL,則它指向一個變數,該變數儲存sendfile() 將從中讀取資料的in_fd 的檔案偏移量。當sendfile() 返回時,此變數將設定為讀取的最後一個位元組後的位元組的偏移量。如果offset 不為 NULL,則sendfile() 不會修改in_fd 的當前檔案偏移量;否則,當前檔案偏移量將被調整以反映從in_fd 讀取的位元組數。

count是要在檔案描述符之間複製的位元組數。

目前(Linux 2.6.9):in_fd必須對應於支援mmap() 類操作的檔案(即,它不能是套接字);並且out_fd必須引用套接字。

如果sendfile() 使用EINVAL或ENOSYS失敗,應用程式可能希望回退到read(2)/write(2)。

備註

如果您計劃使用sendfile() 將檔案傳送到TCP套接字,但需要在檔案內容前面傳送一些頭資料,您會發現使用tcp(7) 中描述的TCP_CORK選項來最小化資料包數量並調整效能非常有用。

在Linux 2.4和更早版本中,out_fd可以引用常規檔案,並且sendfile()會更改該檔案的當前偏移量。

返回值

如果傳輸成功,則返回寫入到out_fd 的位元組數。發生錯誤時,返回 -1,並且errno 被適當地設定。

錯誤

標籤描述
EAGAIN 已使用O_NONBLOCK選擇非阻塞I/O,並且寫入將阻塞。
EBADF 輸入檔案未開啟以供讀取,或者輸出檔案未開啟以供寫入。
EFAULT 錯誤地址。
EINVAL 描述符無效或已鎖定,或者in_fd不可用mmap() 類操作。
EIO in_fd讀取時出現未指定的錯誤。
ENOMEM 記憶體不足,無法從in_fd讀取。

版本

sendfile() 是 Linux 2.2 中的新功能。包含檔案 <sys/sendfile.h> 自 glibc2.1 起出現。

符合標準

POSIX.1-2001 或其他標準中未指定。

其他 Unix 系統使用不同的語義和原型實現sendfile()。不應在可移植程式中使用它。

參見



previous next Printer Friendly

廣告


  

廣告



廣告
© . All rights reserved.