存储映射IO
说明:在进程的栈中开辟一块缓冲区将之与磁盘文件相对应,对缓冲区的更改将自动写入磁盘文件,这样就可以不在使用read和write的情况下执行IO
<sys/mman.h>
mmap函数
void* mmap(void* addr, size_t len, int prot, int flag, int filedes, off_t off )
将filedes指向的文件映射到存储区
返回值:映射后的存储区起始地址(需将addr指定为0)
addr: 指定存储区的起始地址.通常设置为0,表示由系统选择映射存储区.
Filedes:要映射的文件描述符
prot:对映射存储区的保护要求
PROT_READ 映射区可读
PROT_WRITE 映射区可写
PROT_EXEC 映射区可执行
PROT_NONE 映射区不可访问
flag:
MAP_FIXED 返回值必须等于addr
MAP_SHARED 对存储区的更改会对文件造成修改
MAP_PRIVATE 存储区的更改以及之后的操作都是对映射文件副本的修改,不影响原文件
mprotect函数
修改存在的映射存储区的权限
int mprotect( void* addr, size_t len, int prot )
msync函数
将更改后存储区页写回文件
int msync( void *addr, size_t len, int prot )
munmap函数
解除存储映射
int munmap( caddr_t addr, size_t len )
IO多路转接
构造一张有关描述符的列表,然后调用select函数,当一个或多个IO准备好时select返回
int select( int maxfdp1,fd_set * readfds , fd_set* writefds, fd_set* exceptfds, struct timeval* tvptr )
maxfdp1:最大描述符+1,即描述符个数
readfds,writefds,exceptfds:关心的可读,可写和处于异常条件的各个描述符.
Tvptr:愿意等待的事件
== NULL:永远等待
tvptr->tv-sec==0 && tvptr->tv_usec==0:完全不等待
tvptr->tv-sec!=0 || tvptr->tv_usec!=0:等待制定时间