1. 程式人生 > >Linux "零拷貝" sendfile函數中文說明及實際操作

Linux "零拷貝" sendfile函數中文說明及實際操作

如果 自增 循環 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函數中文說明及實際操作