IO复用时用来干什么的? IO复用能够使得程序监听多个文件描述符。 IO复用自己是阻塞的,而且若是无特殊的控制,会顺序地处理 各个文件描述符。这使得程序看起来像是串行的。要实现并发 则须要引入多进程或多线程。 经常使用的IO复用有select、epoll、poll select? 在指定时间内,用于监听用户感兴趣的文件描述符集合上的读写异常事件。 int select(int 监听的文件描述符总数,fd_set*用于读的文件描述符集合, fd_set* 用于写的文件描述符集合,fd_set* 用于异常的文件描述符集合, struct timeval*超时时间) 返回值:返回实际就绪的文件描述符总数 超时失败,超时内异常-1,并设置相应的errorno 传入超时时间->tv_sec,tv_usec都为0,则立返回,NULL一直阻塞到有一个文件描述符就绪 select可以处理的异常状态只有一种:接受到带外数据 poll系统调用的功能和select相似: 在必定时间内,轮询是否有文件描述符处于就绪状态。 int poll(struct pollfd* ,nfds_t 监听的描述符总数,int timeout); 当传入的timeout=-1,则一直阻塞到某个事件发生为止。 timeout=0,当即返回。 epoll系统调用:Linux特有的 epoll---->epoll内核事件表---->内核事件表惟一标识epoll fd(epoll文件描述符) -->epoll fd 用于epoll全部系统调用的第一个参数。 使用方法: ----1 #include <sys/epoll.h> int epoll_create(int size); ----2 #include <sys/epoll.h> int epoll_ctl(int epoll_fd epoll文件描述符,int 增删改? int fd要操做事件的文件,struct epoll_event*事件) 把文件描述符指向的文件上的事件,增删改到内核事件表中。 #include <sys/epoll.h> int epoll_wait(int epoll_fd,struct epoll_event*,struct timeval); 在指定时间内等待一组文件描述符上事件就绪的文件