应用程序中同时处理多路输入输出流,若采用阻塞模式,将得不到预期的目的;若采用非阻塞模式,对多个输入进行轮询,但又太浪费CPU时间;
若设置多个进程,分别处理一条数据通路,将产生进程间的同步与通信问题,使程序变得更加复杂;
头文件
#include<sys/time.h>
#include<sys/types.h>
#include<unistd.h>
参数
1、maxfd
所有监控的文件描述符中最大的那一个加1
2、read_fds
所有要读的文件文件描述符的集合)
3、write_fds
所有要的写文件文件描述符的集合
4、except_fds
其他要向我们通知的文件描述符
5、timeout
超时设置。
NULL∶一直阻塞,直到有文件描述符就绪或出错时间值为0仅仅检测文件描述符集的状态,然后立即返回。
时间值不为0在指定时间内,如果没有事件发生,则超时返回。
为了设置文件描述符我们要使用几个宏
FD_SET 将fd加入到fdset FD_SET
FD_CLR 将fd从fdset里面清除
FD_ZERO 从fdset中清除所有的文件描述符
FD_ISSET 判断fd是否在fdset集合中
接下来。我们监控一个文件描述符(0)
程序如下:
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
int main()
{
//1、定义一个要监控的文件描述符的表
fd_set rdfs;
int retval = 0;
FD_ZERO(&rdfs);//将所有的文件描述符对应的为设0
FD_SET(0,&rdfs);//设置为1
//2、设置select的阻塞时间
struct timeval tv;
tv.tv_sec = 5;
tv.tv_usec =0;
//参数1:监控最大的文件描述符加1.
retval = select(1,&rdfs,NULL,NULL,&tv);
printf("retval返回值:%d\n",retval);
if(retval < 0)
{
perror("select error!");
return -1;
}
else if(0 == retval)
{
printf("5秒内没有数据!\n");
}
else
{
printf("数据已经公布!\n");
}
if(FD_ISSET(0,&rdfs))//判断哪个位是不是1.
{
char buf[100] = {'\0'};
read(0,buf,sizeof(buf));
printf("%s\n",buf);
} return 0;
}
接着我们监控两个文件描述符(0和listenfd)
如图