Chinaunix首页 | 论坛 | 博客
  • 博客访问: 279575
  • 博文数量: 109
  • 博客积分: 2116
  • 博客等级: 大尉
  • 技术积分: 1062
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-22 15:38
文章分类

全部博文(109)

文章存档

2013年(2)

2011年(16)

2010年(90)

2009年(1)

我的朋友

分类: LINUX

2010-07-09 11:08:20

文件锁解决文件的共享问题,下来就是IO复用。

常用selectpoll来处理。

以下是一个实例,监听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

 

阅读(411) | 评论(0) | 转发(0) |
0

上一篇:测试编译环境

下一篇:文件锁

给主人留下些什么吧!~~