使用select函数实现I/O复用
Select函数允许进程指示内核等待多个事件中的一个发生,并只在或多个事件发生或经历一段指定时间后才唤醒。函数原型:
1 |
|
返回:若有就绪描述符就绪就返回就绪数目,若超时返回0,错误发生返回-1
maxfdp1 : 指定待测试的描述符的个数,值是待测最大描述符加1,从0,1,2…到maxfdp1-1都会被测试
readset : 让内核测试读的描述符集合
writeset : 让内核测试写的描述符集合
exceptset : 让内核测试异常条件的描述符集合
对于fd_set的初始化可设置需要使用以下4个宏
1 | void FD_ZERO(fd_set *fdset); //清空文件描述符集合fdset |
Timeout : 是
1 | struct timeval |
的类型,表示告知内核等待所指定的描述符中任何一个就绪可花多长时间。这个参数有以下三种情况:
1)永远等待下去:直到有一个描述符准备好I/O才返回,这时需要将此参数设置为NULL
2)等待一段时间:在有一个描述符准备好I/O时返回,但不能超过timeout中设置的秒数和毫秒数
3)根本不等待:检查描述符后立即返回,这就是轮询。需要将传入的timeout中的秒数和毫秒数都设置为0
Tcp服务端例子:
1 |
|
客户端:
1 |
|