select机制优势
用途:在一段指定的时间内,监听用户感兴趣的文件描述符上可读、可写和异常等事件。
单线程程序里,socket的recv默认阻塞,会导致整个程序的死锁。
而通过多线程+多套接字解决也不是好的选择,其扩展性太差。
或者,设置recv为非阻塞模式,but,重复调用recv并检查返回值,开销太大,且效率低下。
因此,select模型便应运而生。
select模型的关键是使用一种有序的方式,对多个套接字进行统一管理与调度。
用户首先将需要进行IO操作的socket添加到select中,然后阻塞等待select系统调用返回。当数据到达时,socket被激活,select函数返回。用户线程正式发起read请求,读取数据并继续执行。
最大优势:
使用select,用户可以在一个线程内同时处理多个socket的IO请求。用户可以注册多个socket,然后不断地调用select读取被激活的socket,即可达到在同一个线程内同时处理多个IO请求的目的。
select函数解读
1 | int select( |
几个宏定义:
1 | FD_SET(fd, &fdset) 设置fd的监听位 |
VxWorks下select代码示例
1 | #include <string.h> |
参考文章地址:
https://www.vxworks.net/app/46-socket-programming-source-code-for-tcp-select-in-vxworks
https://blog.csdn.net/gubenpeiyuan/article/details/8983484