1、I/O模型
一个输入操作通常包括两个不同阶段:等待数据准备好;从内核到进程拷贝数据。
阻塞I/O模型
非阻塞I/O模型
I/O复用模型:内核发现进程指定的一个或多个I/O条件就绪,它就通知进程,由select和poll两个函数支持
信号驱动I/O模型:内核在描述字就绪时发送SIGIO信号通知进程
异步I/O模型:让内核启动一个操作,并在整个操作完成后通知进程
2、select函数
#include <sys/select.h>
#include <sys/time.h>
int select (int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *expectset, const struct timeval *timeout)
select函数指定一系列描述字,在一个描述字就绪或者等待指定时间后返回,返回所有已就绪的描述字个数
参数timeout指定最长等待时间,为NULL时,函数将一直等待直到有描述子就绪
参数readset、writeset和expectset指定让内核测试的读、写和异常条件描述字。这三个参数的类型时描述字集fd_set,可以
通过下面4个宏来操作:
void FD_ZERO (fd_set *fdset)
void FD_SET (int fd,fd_set *fdset)
void FD_CLR (int fd, fd_set *fdset)
int FD_ISSET (int fd, fd_set *fdset) //判断fdset描述字集中的fd描述字是否就绪
select函数修改由readset、writeset和expectset所指向的描述字集,这三个参数是值-结果参数,调用函数时,指定所关心的描述字,
返回时,指示就绪的描述字。因此,当重新调用select函数时,必须重新设置描述字集
maxfdp1的值是最大描述字加1