Linux中的poll机制

Linux中,如果想要采用中断程序,则需要修改驱动, 方便起见,使用select/poll机制进行相应

selectpoll在使用时,都会自动挂起当前进程,当响应条件达成时,根据返回值来判断是哪一种响应,作出相应的操作。

 

int select (int n, fd_set *readfds, fd_set *writefds, fd_set*exceptfds, struct timeval *timeout);

select可以监视三种文件描述符,分别为writefdsreadfdsexceptfds,还有一种是超时。当select返回是,通过遍历这几种文件描述符(或超时),来判断是哪种响应,并进行相关操作

 

int poll (struct pollfd *fds, unsigned int nfds, inttimeout);

poll可以监视的有很多种,并且一样也有超时操作,与select相似

关于poll监视的文件描述符宏定义如下:

 

#define POLLIN 0x0001      //普通或优先级带数据可读

#define POLLPRI 0x0002    //高优先级数据可读

#define POLLOUT 0x0004  //普通数据可写

#define POLLERR 0x0008  //发生错误

#define POLLHUP 0x0010  //发生挂起

#define POLLNVAL 0x0020  //描述字不是一个打开的文件

  

#define POLLRDNORM 0x0040  //普通数据可读

#define POLLRDBAND 0x0080  //优先级带数据可读

#define POLLWRNORM 0x0100  //普通数据可写

#define POLLWRBAND 0x0200  //优先级带数据可写

#define POLLMSG 0x0400     //消息可用

 

关于poll的部分例程如下:

 

    intfd;

 

    if((fd=open_port(fd,3))<0){

        printf("open_port error");

        return;

    }

 

    if((i=set_opt(fd,9600,8,'N',1))<0){

        printf("set_opt error");

        return;

    }

 

    int nread = 0;

    int ret;

    struct pollfd event;

   

    char readBuf[10];

    memset(readBuf, 0, 10);

 

    memset(&event,0,sizeof(event));

    event.fd = fd;

    event.events = POLLIN;

    ret=poll((struct pollfd *)&event,1,50);

 

    if(ret<0){

        printf("poll error!\n");

        exit(1);

    }

    if(ret==0){

        printf("Time out!\n");

    }

    if(event.revents&POLLERR){

        printf("Device error!\n");

        exit(1);

    }

    if(event.revents&POLLIN){

        nread = read(fd,readBuf,10);

        printf("nread =%d,%s\n",nread,readBuf);

    }

 

在执行ret=poll((structpollfd *)&event,1,50);这句之后,这个进程会自动挂起,直到POLLIN被触发,或者超时50ms之后,运行接下来的语句

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值