细雨斜风作晓寒
淡烟疏柳媚晴滩
readv和writev
#inlcude <sys/uio.h>
ssize_t readv(int fd, const struct iovec* vec, int count)
ssize)t writev(int fd, struct iovec* vec, int count)
readv将数据从文件描述符读到分散的内存块中,即分散读;writev则将分散的内存数据一并写到文件描述符中,即集中写。其中iovec结构体定义如下:
struct iovec
{
void *iov_base;//内存起始地址
size_t iov_len;//内存长度
}
sendfile
#include <sys/sendfile.h>
ssize_t sendfile(int out, int in_fd, off_t *offset, size_t count)
其中:
- in_fd是待读出内容的文件描述符
- out_fd是待写入文件描述符
- offset指定读入位置,默认为起始位置
- count指定传输字节数
mmap和munmap
#include <sys/mman.h>
void* mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)
int munmap(void *start, size_t length)
mmap用于申请一段内存空间,将其作为进程间通信的共享内存,也可以将文件直接映射到其中;munmap则用于释放这段内存
splice
#include <fcntl.h>
ssize_t splice(int fd_in, loff_t *off_in, int fd_out, loff_t *off_out, size_t len, unsigned int flags)
用于在两个文件描述符之间移动数据,也是零拷贝操作
tee
#include <fcntl.h>
ssize_t tee(int fd_in, int fd_out, size_t len, unsigned int flags)
用于在两个管道文件描述符之间复制数据,零拷贝操作
fcntl
#include <fcntl.h>
int fcntl(int fd, int cmd,...)
对文件描述符进行各种操作
tips
Mac端以上很多函数与Unix端是不一样的,也有一些函数,Mac端可能并未采用