多路复用
1、多路复用的优点
2、select()函数—用于探测多个文件句柄的状态变化
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
参数:
nfds:最大文件描述符+1
readfds:读事件的表
writefds:写事件的表
exceptfds:异常事件的表
timeout:超时检测 NULL: 一直阻塞,直到文件描述符准备好为止
返回值:
成功: 准备好的文件描述符的个数 ;失败: -1
----------------------------------------------------------
void FD_CLR(int fd, fd_set *set); // 把表中删除一个文件描述符
int FD_ISSET(int fd, fd_set *set); //检测文件描述符是否准备好了,准备好了返回1,否则返回0
void FD_SET(int fd, fd_set *set); // 加入到表中
void FD_ZERO(fd_set *set); // 清空表
基本原理:首先创建一张文件描述符表(fd_set),通过使用特有的函数(select),让内核帮助上层用户循环检测是否有可操作的文件描述符,如果有则告诉应用程序去操作。
代码实例:(有名管道的应用)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/time.h>
int main(int argc, const char *argv[])
{
int fd1 = open("./f1", O_RDWR);
int fd2 = open("./f2", O_RDWR);
int fd3 = open("./f3", O_RDWR);
//1.创建一张文件描述符表
fd_set readfds, tmpfds;
FD_ZERO(&readfds); //2.清空表
FD_SET(fd1, &readfds);
FD_SET(fd2, &readfds);
FD_SET(fd3, &readfds);
int maxfd = fd3;
tmpfds = readfds;
char buf[64] = {
0};
int ret, i;
while(1)
{
readfds = tmpfds