一、多路复用IO
在不创建新的进程和线程的情况下监控多个文件描述符,多应用于网络编程时一个服务端程序为多个客户端程序提供服务,多用于在业务逻辑简单,客户端需要的服务时间短,响应时间无太高要求的场景。
二、使用select函数实现多路复用IO
int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);
功能:监控多个文件描述符的 读、写、异常 操作
nfds:最大文件描述符+1
readfds:监控读操作文件描述符集合
writefds:监控写操作文件描述符集合
exceptfds:监控异常操作文件描述符集合
timeout:设置超时时间
返回值:监控到文件描述符的个数,超时返回0,出错返回-1
void FD_CLR(int fd, fd_set *set);
功能:从集合吕删除文件描述符
int FD_ISSET(int fd, fd_set *set);
功能:测试集合中是否有文件描述符存在
void FD_SET(int fd, fd_set *set);
功能:向集合中添加文件描述符
void FD_ZERO(fd_set *set);
功能:清空文件描述符集合
select设计不合理的地方:
1、所有被监视的文件描述符都需要检查(效率不高)。
2、每次调用select都需要向它传递新的监视对象信息
select的优点是:
程序的兼容性高
int pselect(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timespec *timeout, const sigset_t *sigmask);
功能:与select的功能大致