线程负责监听和处理不同的需求
顾客:代表需要被监控的文件句柄或网络socket,他们可能有各种需求,如点餐(发送数据)、询问菜品状态(读取数据)或需要帮助(异常处理)
菜单:服务员手中的菜单(文件描述符集合)列出了所有座位号(文件描述符),用于快速查找和响应顾客的需求。
- 初始化菜单:
- 服务员(线程)开始工作时,首先会准备一份空菜单(初始化文件描述符集合),然后将所有顾客(文件句柄或socket)的座位号(文件描述符)添加到菜单上,标记他们可能需要的服务类型(读、写、异常
等待顾客需求:
- 服务员(线程)调用“select函数”(相当于询问顾客是否需要服务),将菜单(文件描述符集合)交给餐厅经理(操作系统内核),然后服务员进入等待状态。
- 餐厅经理(操作系统内核)查看每位顾客的状态,如果有顾客举手示意(文件描述符就绪),经理会将这些顾客的座位号记录下来
处理顾客需求:
- 当有顾客举手或超时发生时,服务员(线程)被唤醒,并查看经理(操作系统内核)提供的座位号列表。
- 服务员(线程)按照座位号找到对应的顾客,根据他们的需求提供服务(如读取数据、发送数据或处理异常
DEBUG
1
许多在Linux/Unix 系统下编写的C/C++代码需要头文件unistd.h,但Windows 环境下没有该头文件,所以用VS编译会报错
解决方法:
将
#include <unistd.h>
替换成
-
#include <io.h>
-
#include <process.h>
将头文件:#include <sys/socket.h>,替换成:#include <winsock.h>