- select函数:
#include <sys/select.h>int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);/*参数:nfds: 要监视的最大文件描述符+1readfds: 要监视的读文件描述符集合 不关心可以传NULLwritefds: 要监视的写文件描述符集合 不关心可以传NULLexceptfds: 要监视的异常文件描述符集合 不关心可以传NULLtimeout: 超时时间 如果设置成NULL 会一直阻塞 直到有文件描述符就绪返回值:成功 就绪的文件描述符的个数超时 0失败 -1 重置错误码*///struct timeval 可以指定超时时间//如果结构体的两个成员都为0 表示非阻塞struct timeval {long tv_sec; //秒 long tv_usec; //微秒};void FD_CLR(int fd, fd_set *set); //将文件描述符在集合中删除int FD_ISSET(int fd, fd_set *set); //判断文件描述符是否还在集合中// 返回0 表示不在了 非0 表示在void FD_SET(int fd, fd_set *set); //向集合中添加一个文件描述符void FD_ZERO(fd_set *set); //清空集合
- poll函数:
#include <poll.h>int poll(struct pollfd *fds, nfds_t nfds, int timeout);/*参数:fds:要监视的文件描述符的集合指向自定义的结构体数据nfds:fds中已经使用的项目的个数timeout:超时时间单位是毫秒 设置成10000 表示10s-1 永久阻塞0 非阻塞返回值:0 超时-1 出错 重置错误码正数 成功 返回的就绪的文件描述符的个数*/struct pollfd {int fd; /* 文件描述符 设置成-1 内核就不再监视这一位了*/short events; /* 要监视的事件 */short revents; /* 返回的事件 */};/*要监视的事件是用位运算或起来的要监视的事件放在events字段,而实际就绪的事件在revents字段返回POLLIN 读事件POLLOUT 写时间POLLERR 异常事件*/
- 创建红黑树(epoll_create函数):
#include <sys/epoll.h>int epoll_create(int size);/*功能:创建epoll/创建epoll实例的描述符参数:size:参数已经被忽略了,只需要填写大于0的值即可返回值:epoll_create 调用成功时会返回一个非负整数epfd,表示新创建的 epoll 实例的文件描述符,如果调用失败则返回 -1,并设置 errno 变量以指示具体错误原因*/
- 将关心的文件描述符加入到红黑树(epoll_ctl函数):
- 功能:epoll的控制操作或者用于向 epoll 实例中添加、修改、删除事件;
- epoll_ctl函数:
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);/*参数:epfd:epoll的文件描述符op:控制方式EPOLL_CTL_ADD:添加EPOLL_CTL_MOD:修改EPOLL_CTL_DEL:删除fd:被操作的文件描述符event:(事件)结构体指针返回值: 成功返回0,失败返回-1 置位错误码*/
- 等待文件描述符中的事件是否就绪,成功则返回就绪的文件描述符的个数(epoll_wait函数):
- epoll_wait函数:
int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);/*参数:epfd:epoll的文件描述符events:准备好的事件的结构体地址maxevents:返回的最大的文件描述符的个数timeout:超时>0 :毫秒级别的超时时间=0 :立即返回=-1:不关心超时时间返回值:成功返回准备好的文件描述符的个数返回0代表超时时间到了失败返回-1置位错误码*/