Linux下的IO复用

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);
在指定时间内等待一组文件描述符上事件就绪的文件 
   

你可能感兴趣的:(Linux下的IO复用)