一、为什么要使用多路复用I/O?
1、若采用阻塞模式,将得不到预期的目的
2、若采用非阻塞模式,对多个输入进行轮询,但又太浪费CPU时间
3、若设置多个进程,分别处理一条数据通路,将产生进程间的同步与通信问题,使程序变得更加复杂
所以引出“多路复用I/O”!
二、多路复用I/O 的基本思想:
1、先构造一张有关描述符的表,然后调用一个函数(select)。当这些文件描述符中的一个或多个已准备好进行I/O时函数才返回
2、函数返回时告诉进程那个描述符已就绪,可以进行I/O操作
三、代码如何使用?
#include <stdio.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
//1、创建文件描述符的集合
fd_set rdfs;
//2、清空文件
while(1){
FD_ZERO(&rdfs);
//3、将要监控的文件描述符加入集合中
FD_SET(0,&rdfs);
struct timeval myval;
myval.tv_sec = 5;
myval.tv_usec = 0;
//4、select
int ret = select(1,&rdfs, NULL, NULL, &myval);
if(ret < 0)
{
perror("select error");
return -1;
}else if(ret == 0)
{
printf("timeout\n");
}
else if(ret > 0)
{
char buf[20] = {'\0'};
//5、判断此文件描述符对应表中的那一位是否为1
if(FD_ISSET(0, &rdfs))
{
read(0, buf, sizeof(buf));
printf("%s",buf);
}
}
}
return 0;
}