1. 非阻塞IO
对于一个给定的文件描述符,有两种方法对其指定非阻塞IO:
- 如果调用open获得描述符,则可指定O_NONBLOCK标志
- 如果对于一个已经打开的描述符,则可调用fcntl,由这个函数打开O_NONBLOCK文件状态标志。
2. 记录锁
记录锁的功能是:当一个进程读或者修改某一文件某个部分时,可以阻止其他进程修改同一文件区。
fcntl函数的第三个参数是一个指向flock结构体的指针,通过它可以指定锁的类型。
3. 多路转接IO
先构造一张有关描述符的列表,然后调用一个函数,直到这些描述符中的一个已准备好进行IO时,该函数才返回。在返回时,告诉进程哪些描述符已准备好可以进行IO。
select
传向select的参数告诉内核:
- 我们所关心的描述符
- 每个描述符我们所关心的状态
- 愿意等待的事件
从select返回时,内核告诉我们: - 已准备好的描述符数量
- 对于读、写、异常状态,哪些描述符就绪
select底层是用位图来记录事件的:
poll
与select不同,poll不是为每个状态构造一个描述集,而是构造了一个pollfd结构数组,每个数组元素指定一个描述符编号以及对其关心的状态。
4. 存储映射IO
使一个磁盘文件与存储空间中的一个缓冲区相映射,于是从缓冲区读数据就相当于读文件的相应字。
将一个指定的文件映射到指定的存储区域,用mmap函数:
#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags,
int fd, off_t offset);