IO等于 等待加拷贝!
recv == 读io == 读事件就绪+内核数据拷贝至用户空间
send == 写io == 写事件就绪+用户空间数据拷贝至内核
高效IO的本质是:尽可能减少等的比重
自己等自己钓:同步IO
让别人钓,自己走了:异步IO
select 和poll 和 epoll 只负责IO中的等待
操作系统收到信息会向进程发送这个信号
select只负责等
select一次可以等多个fd
以阻塞方式等代码
修改成非阻塞方式代码,-1是read读取失败
区别下是底层数据没有就绪 还是真的读取失败
EAGAIN == 11 ==tryagain
表示缓冲区没数据可以读
nfds : 最大的文件描述符+1 我如果要等1和7 这里填写8
timeval:填几秒就是阻塞方式等待几秒
返回值:已经有几个文件描述符准备就绪
= 0 : 等待超时
-1:失败,错误
fd_set:文件描述符集合
fd_set:既是输入型参数,又是输出型参数,输入是用户想告诉操作系统,输出是操作系统想告诉用户
告诉操作系统,帮我关心这些文件描述符上的读事件是否就绪,其他同理
fd_set是一个位图结构 比特位的位置代表是哪一个文件描述符
sock如果有新请求,这个请求是以读事件来让操作系统报告给用户的。
timeout :null 阻塞方式等待
0:进去就马上扫描,有就有,没有也给我马上返回,不等
具体的数组:以阻塞方式等待指定秒数/
实验现象
recv中的Buf是用户定义的缓冲区
size_t len期望读的长度比缓冲区数据存在长度大也没关系,不会被阻塞,实际读多少,这个函数返回多少
select可以等的文件描述符的数量是有上限的
POLL没有上限,
POLL将输入输出分离
多路转接适合长连接