Linux的高效傳輸函式sendfile
阿新 • • 發佈:2019-01-13
參考手冊:http://man7.org/linux/man-pages/man2/sendfile.2.html
函式原型:
#include <sys/sendfile.h>
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
out_fd是需要輸出資料的fd;in_fd是需要獲取資料的fd;offset是拷貝資料的起始點,如果是NULL,則從頭開始拷貝;count是拷貝的位元數。
這是在核心中進行轉換,不用進入使用者態,因此效率非常高。
程式碼例項:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/sendfile.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc, char* argv[]) {
if (argc != 4) {
perror("usage: %s <src file> <dst file> <length of data>\n");
return -1;
}
int len = atoi(argv[3]);
if (len < 0) {
perror("length error\n");
return -1;
}
int readfd = open(argv[1], O_RDONLY);
if (readfd < 0) {
perror("open read fd failed\n");
return -1;
}
int writefd = open(argv[2], O_WRONLY | O_CREAT);
if (writefd < 0) {
perror("open write fd failed\n");
return -1;
}
if (sendfile(writefd, readfd, NULL, len) < 0) {
perror("sendfile() error\n");
return -1;
}
close(writefd);
close(readfd);
return 0;
}