20200211
Plan
40min: UNP
Notes
UNP
I/O 模型
阻塞式 I/O: 包括多路服用 非阻塞式 I/O: 需要多次调用,类似于 polling 信号驱动式 I/O(signal-driven I/O): 类似 interupt 的机制,不同于异步 I/O,接收到通知后,仍然需要去将数据从内核拷贝到进程的缓冲区 异步 I/O: 和信号驱动式的区别在于,接收到通知的时候数据已经被拷贝到了进程缓冲区
select 函数
记录一下函数签名
#include <sys/select.h>
#include <sys/time.h>
int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);
有两点容易搞错:
- maxfdp1 = 最大 fd + 1, 因为这里是指需要检查的 fd 个数,而 fd 是从 0 开始的
- 返回值为就绪的 fd 个数,但是需要注意的是三个入参 fd set 都被修改了,只保留了就绪的 fd flag,因此处理完毕后,进行下一轮 select 的时候,需要记得将关注的 fd 都重新标记上。