Socket编程(三)

高级I/O API

Posted by Gavin on November 22, 2019

细雨斜风作晓寒

淡烟疏柳媚晴滩

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端可能并未采用