1、五种I/O模型:
(1)阻塞式I/O;(2)非阻塞式I/O;(3)I/O复用(select、poll);(4)信号驱动式I/O(SIGIO);(5)异步I/O(aio_系列函数);
一个输入操作分为两个阶段:A. 等待数据准备好;B. 从内核向进程复制数据。
一个套接字上的输入也类似,A. 等待数据从网络中到达(所等待分组到达时,会被复制到内核中的某个缓冲区);B. 把数据从内核缓冲区复制到应用进程缓冲区。
2、I/O复用
(1)I/O复用模型:阻塞在select或者poll上,而不是阻塞在真正的I/O系统调用(recvfrom)上。
(2)I/O复用典型网络应用场合:
3、select函数
#include <sys/select.h>
#include <sys/time.h>
int select(int maxfd1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);
/*
maxfd1:指定待测试的描述符的个数,它的值是待测试的最大描述符+1(描述符是从0开始的)。比如打开的描述符集合是:{1, 4, 5},那么maxfd1的值就是6。
*/
/*
readset、writeset、exceptset指定我们要让内核测试读、写、异常条件的描述符。
如果对某