
IO多路复用select与多进程和多线程技术相比I/O多路复用技术的最大优势是系统开销小系统不必创建进程/线程也不必维护这些进程/线程从而大大减小了系统的开销。nfds委托内核检测的这三个集合中最大的文件描述符 1内核需要线性遍历这些集合中的文件描述符这个值是循环结束的条件 在Window中这个参数是无效的指定为-1即可 readfds文件描述符的集合, 内核只检测这个集合中文件描述符对应的读缓冲区传入传出参数 writefds文件描述符的集合, 内核只检测这个集合中文件描述符对应的写缓冲区传入传出参数 exceptfds文件描述符的集合, 内核检测集合中文件描述符是否有异常状态传入传出参数 timeout超时时长用来强制解除select()函数的阻塞的 NULL函数检测不到就绪的文件描述符会一直阻塞。 等待固定时长秒函数检测不到就绪的文件描述符在指定时长之后强制解除阻塞函数返回0 不等待函数不会阻塞直接将该参数对应的结构体初始化为0即可。 函数返回值 大于0成功返回集合中已就绪的文件描述符的总个数 等于-1函数调用失败 等于0超时没有检测到就绪的文件描述符文件描述符表默认1024bitselect中途会产生集合的复制// 将文件描述符fd从set集合中删除 将fd对应的标志位设置为0 void FD_CLR(int fd, fd_set *set); // 判断文件描述符fd是否在set集合中 读一下fd对应的标志位到底是0还是1 int FD_ISSET(int fd, fd_set *set); // 将文件描述符fd添加到set集合中 将fd对应的标志位设置为1 void FD_SET(int fd, fd_set *set); // 将set集合中, 所有文件文件描述符对应的标志位设置为0, 集合中没有添加任何文件描述符 void FD_ZERO(fd_set *set);epollint epoll_create(int size);函数参数 size在Linux内核2.6.8版本以后这个参数是被忽略的只需要指定一个大于0的数值就可以了。// 联合体, 多个变量共用同一块内存 typedef union epoll_data { void *ptr; int fd; // 通常情况下使用这个成员, 和epoll_ctl的第三个参数相同即可 uint32_t u32; uint64_t u64; } epoll_data_t; struct epoll_event { uint32_t events; /* Epoll events */ epoll_data_t data; /* User data variable */ }; int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);op控制通过该函数执行什么操作EPOLL_CTL_ADD往epoll模型中添加新的节点EPOLL_CTL_MOD修改epoll模型中已经存在的节点EPOLL_CTL_DEL删除epoll模型中的指定的节点fd文件描述符即要添加/修改/删除的文件描述符events委托epoll检测的事件EPOLLIN读事件, 接收数据, 检测读缓冲区如果有数据该文件描述符就绪EPOLLOUT写事件, 发送数据, 检测写缓冲区如果可写该文件描述符就绪EPOLLERR异常事件data用户数据变量这是一个联合体类型通常情况下使用里边的fd成员用于存储待检测的文件描述符的值在调用epoll_wait()函数的时候这个值会被传出。int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);函数参数epfdepoll_create() 函数的返回值, 通过这个参数找到epoll实例events传出参数, 这是一个结构体数组的地址, 里边存储了已就绪的文件描述符的信息maxevents修饰第二个参数, 结构体数组的容量元素个数timeout如果检测的epoll实例中没有已就绪的文件描述符该函数阻塞的时长, 单位ms 毫秒0函数不阻塞不管epoll实例中有没有就绪的文件描述符函数被调用后都直接返回大于0如果epoll实例中没有已就绪的文件描述符函数阻塞对应的毫秒数再返回-1函数一直阻塞直到epoll实例中有已就绪的文件描述符之后才解除阻塞函数返回值成功等于0函数是阻塞被强制解除了, 没有检测到满足条件的文件描述符大于0检测到的已就绪的文件描述符的总个数CMakecmake_minimum_required(VERSION 3.0) 最低版本 project(CALC) 工程名称 add_executable(app add.c div.c main.c mult.c sub.c) 生成可执行程序CMAKE_CXX_STANDAD 指定c版本EXECUTABLE_OUTPUT_PATH 输出路径CMAKE_CURRENT_SOURCE_DIR 宏表示当前访问的 CMakeLists.txt 文件所在的路径。LIBRARY_OUTPUT_PATH 指定静态/动态库生成路径set(SRC_LIST add.c;div.c;main.c;mult.c;sub.c) 变量赋值字符串aux_source_directory( dir variable ) 查找某个路径下全部源文件file(GLOB/GLOB_RECURSE 变量名 要搜索的文件路径和文件类型) GLOB_RECURSE递归搜索指定目录include_directories(headpath) 指定头文件路径add_library(库名称 STATIC 源文件1 [源文件2] ...) shared 动态库link_directories(lib path)静态库连接target_link_libraries(targetPRIVATE|PUBLIC|INTERFACE item...[PRIVATE|PUBLIC|INTERFACE item...]...) 连接动态库public有传递性在程序生成之后list(APPEND list [element ...]) 变量追加list(REMOVE_ITEM list value [value ...])变量移除link_directories(lib path) 指定库的路径