/* multiplex_poll.c */
#include<unistd.h>
#include<stdio.h>
#include<fcntl.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<errno.h>
#include<poll.h>
#define Max_Buffer_Size 1024 /*缓冲区大小 1KB*/
#define In_Files 3 /*多路复用输入文件数目*/
#define Time_Delay 60000 /* 超时时间秒数:60s */
#define MAX(a,b) ((a>b)?(a):(b)) /* 宏函数定义,判断a和b中较大数*/
int main()
{
struct pollfd fds[In_Files]; /*定义一个pollfd结构体数组*/
char buf[Max_Buffer_Size];
int i,res,real_read,maxfd;
//首先按一定的权限打开两个源文件
fds[0].fd=0;
if((fds[1].fd=open("in1",O_RDONLY|O_NONBLOCK))<0)
{
printf("Opne in1 error\n");
return 1;
}
if((fds[2].fd=open("in2",O_RDONLY|O_NONBLOCK))<0)
{
printf("Opne in2 error\n");
return 1;
}
//取出两个文件描述符中的较大者
for(i=0;i<In_Files;i++)
{
fds[i].events=POLLIN;
}
//循环测试是否存在正在监听的文件描述符
while(fds[0].events||fds[1].events||fds[2].events)
{
if(poll(fds,In_Files,0)<0)
{
printf("Poll error or Time out\n");
return 1;
}
for(i=0;i<In_Files;i++)
{
if(fds[i].revents) //判断在哪个文件上发生了事件
{
memset(buf,0,Max_Buffer_Size); //将buf数组初始化为0
//从文件描述符fd指定的文件中读取1KB的数据放到buf中,并将实际读到的数据
//赋值给real_read,方便下边的判断
real_read=read(fds[i].fd,buf,Max_Buffer_Size);
//当real_read为0时,出错
if(real_read<0)
{
if(errno!=EAGAIN)
{
return 1; //系统错误,结束运行
}
}
else if(!real_read) //当real_read为0时,表示已到达文件尾
{
close(fds[i].fd);
fds[i].events=0; //取消对该文件的监听
}
else //如果real_read不为0,则表示从该文件中读出了real_read的字节数据
{ //但是还没有读完
if(i==0) //如果在标准输入上有数据输入时
{
if((buf[0]=='q' || buf[0]=='Q'))
{
return 1; //输入“q”或“Q”,则会退出
}
}
else
{ //将读取到的数据先传送到终端上
buf[real_read]='\0';
printf("%s",buf);
} //end of (if==0)
}//end of if real_read
} //end of if(fds[i].revents)
} //end of for
} //end of while(1)
exit(0);
}