如果为每个客户端创建一个进程(或线程),因为linux系统文件标识符最多1024位,是有限的。
所以使用IO复用技术,提高并发程度。
在属主进程(线程中声明)
所谓信号驱动,就是信号处理函数signal触发后执行回调函数
即在IO输入后触发,可查看signal函数参数
但是不能同时处理多个,所以引入select
对timeout的调用
结构体成员为秒与微秒
为了配合select函数执行,有如下宏函数:
void FD_CLR(int fd, fd_set *set);
功能:将指定的set集合中编号为fd的描述符号删除。
int FD_ISSET(int fd, fd_set *set);
功能:判断值为fd的描述符是否在set集合中,
如果在则返回真,否则返回假。
void FD_SET(int fd, fd_set *set);
功能:将指定的fd描述符,添加到set集合中。
void FD_ZERO(fd_set *set);
功能:将指定的set集合中所有描述符删除。
示例
接收到信号后,需要对select函数的第一个参数及后面的参数进行更新
功能说明 :创建一个 epoll 对象,返回该对象的描述符,注意要使用 close 关闭该描述符。
参数说明 :从 Linux 内核 2.6.8 版本起,size 这个参数就被忽略了,只要求 size 大于 0 即可。
功能说明 :操作控制 epoll 对象,主要涉及 epoll 红黑树上节点的一些操作,比如添加节点,删除节点,修改节点事件。
参数说明
epfd:通过 epoll_create 创建的 epoll 对象句柄。
op:对红黑树的操作,添加节点、删除节点、修改节点监听的事件,分别对应 EPOLL_CTL_ADD,EPOLL_CTL_DEL,EPOLL_CTL_MOD。
添加事件:相当于往红黑树添加一个节点,每个客户端连接服务器后会有一个通讯套接字,每个连接的通讯套接字都不重复,所以这个通讯套接字就是红黑树的 key。
修改事件:把红黑树上监听的 socket 对应的监听事件做修改。
删除事件:相当于取消监听 socket 的事件。
fd:需要添加监听的 socket 描述符,可以是监听套接字,也可以是与客户端通讯的通讯套接字。
event:事件信息。
封装成函数
参数说明
epid:epoll_create 返回的 epoll 对象描述符。
events:存放就绪的事件集合,这个是传出参数
maxevents:代表可以存放的事件个数,也就是 events 数组的大小。
timeout:阻塞等待的时间长短,以毫秒为单位,如果传入 -1 代表阻塞等待
默认是水平触发
设置边沿触发(条件:非阻塞模式下)