Linux "零拷貝" sendfile函數中文說明及實際操作
阿新 • • 發佈:2018-04-05
如果 自增 循環 set write blog 數據 文件描述符 efault
Sendfile函數說明
#include
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
sendfile()是作用於數據拷貝在兩個文件描述符之間的操作函數.這個拷貝操作是內核中操作的,所以稱為"零拷貝".sendfile函數比起read和write函數高效得多,因為read和write是要把數據拷貝到用戶應用層操作.
參數說明:
out_fd 是已經打開了,用於寫操作(write)的文件描述符;
in_fd 是已經打開了,用於讀操作(read)的文件描述符;
offset 偏移量;表示sendfile函數從in_fd中的哪一偏移量開始讀取數據.如果是零表示從文件的開始讀,否則從相應的偏移量讀取.如果是循環讀取的時候,下一次offset值應為sendfile函數返回值加上本次的offset的值. offset為傳入傳出參數,在用循環傳大文件的時候會自增。
count是在兩個描述符之間拷貝的字節數(bytes)
返回值:
如果成功的拷貝,返回寫操作到out_fd的字節數,錯誤返回-1,並相應的設置error信息.
EAGAIN 無阻塞I/O設置O_NONBLOCK時,寫操作(write)阻塞了.
EBADF 輸出或者輸入的文件描述符沒有打開.
EFAULT 錯誤的地址.
EINVAL 描述符不可用或者鎖定了,或者用mmap()函數操作的in_fd不可用.
EIO 當讀取(read)in_fd時發生未知錯誤.
ENOMEM 讀(read)in_fd時內存不足.
off = 0; while((ret = sendfile(new_fd,fd,&off,4096))>0) { if(ret == -1) { perror("sendfile"); } }
Linux "零拷貝" sendfile函數中文說明及實際操作