分类: LINUX
2010-07-09 11:08:20
文件锁解决文件的共享问题,下来就是IO复用。
常用select和poll来处理。
以下是一个实例,监听3个终端的输入:两个管道和主程序。应用函数poll,代码来自华清远见。
源码:
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX_BUFFER_SIZE 1024
#define IN_FILES 3 //复用文件的数目
#define TIME_DELAY 60000
#define MAX(a, b) ((a>b)?(a):(b))
int main(void)
{
struct pollfd fds[IN_FILES];
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("open in1 error\n");
return 1;
}
if((fds[2].fd=open("in2", O_RDONLY|O_NONBLOCK))<0)
{
printf("open in2 error\n");
return 1;
}
//取出文件描述符较大者
for(i=0;i
{
fds[i].events=POLLIN;
}
//循环测试文件描述符是否就绪,调用poll函数做出对应操作
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
{
if(fds[i].revents)
{
memset(buf, 0, MAX_BUFFER_SIZE);
real_read=read(fds[i].fd, buf, MAX_BUFFER_SIZE);
if(real_read<0)
{
if(errno!=EAGAIN)
{
return 1;
}
}
else if(!real_read)
{
close(fds[i].fd);
fds[i].events=0;
}
else
{
if(i==0)
{
if((buf[0]=='q')||(buf[0]=='Q'))
{
return 1;
}
}
else
{
buf[real_read]='\0';
printf("%s", buf);
}
}
}
}
}
exit(0);
}
主程序之外创建另外两个终端打开对应的管道
Mknod in1 p
Mknod in2 p
实验结果如下:
主程序端
管道1
管道2