Chinaunix首页 | 论坛 | 博客
  • 博客访问: 82090
  • 博文数量: 19
  • 博客积分: 575
  • 博客等级: 中士
  • 技术积分: 203
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-03 20:06
个人简介

好好学习,天天向上

文章分类

全部博文(19)

分类: LINUX

2011-04-09 12:57:49

 

    poll这个单词的意思是轮询,轮流询问。当一个应用程序可以访问多个设备,可以从多个设备中获取或者写入数据,但是有时候设备不一定准备好了,所以就有一个询问设备是否准备好的过程,内核提供了poll系统调用来查询这些设备是否可读或是可写,这依赖于驱动的poll实现。

应用层的poll

 

  1. #include <poll.h>

  2. int poll(struct pollfd fds[], nfds_t nfds, int timeout);

  3. struct pollfd {

  4.   int fd;

  5.   short events;

  6.   short revents;

  7. };

 

fds是文件集,nfds是文件个数,timeout是超时时间,以ms为单位。

返回可用文件的个数,如果为0表示超时了。

events设置要等待的条件,revents返回的条件:

POLLIN|POLLRDNORM 标志一个可读的设备

POLLOUT|POLLWRNORM 标志一个可写的设备

POLLHUP 文件尾部

使用poll比较简单,只要设置好fds,然后poll一次,检测events,然后进行相关处理就OK了。

驱动层的poll

当应用程序调用poll时,驱动层的poll会被调用,驱动层poll的主要工作:

1. 在一个或多个可指示查询状态变化的等待队列上调用 poll_wait.

2. 返回一个位掩码, 描述可能不必阻塞就立刻进行的操作.

linux/fs.h

 

  1. unsigned int (*poll) (struct file *filp, struct poll_table_struct *poll_table);

  2. linux/poll.h

  3. void poll_wait (struct file *filp, wait_queue_head_t *wq, poll_table *pt);

 

poll_wait的作用是增加调用poll应用程序的进程到等待队列,这样当事件到达(IO空间可读或可写的时候)就会唤醒应用程序。 
给内存设备驱动增加poll:
  1. unsigned int base_char_poll(struct file*filp,struct poll_table_struct *poll_table)
  2. {
  3.     struct dev_info_struct *dev_info_ptr=(struct dev_info_struct*)filp->private_data;
  4.     unsigned int mask=0; poll_wait(filp,&dev_info_ptr->wq,poll_table);
  5.     mask |= POLLOUT|POLLWRNORM;//always can write
  6.     if(dev_info_ptr->have_data!=0) mask |= POLLIN|POLLRDNORM; printk("base char: poll :\n");
  7.     return mask;
  8. }
测试:test.c
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <fcntl.h>
  5. #include <unistd.h>
  6. #include <linux/poll.h>
  7. int main()
  8. {
  9.     int fd=open("/dev/base_char",O_RDWR);
  10.     int count=0;
  11.     if(fd<0)
  12.     {
  13.        perror("");
  14.        return -1;
  15.     }
  16.     char buf[50];
  17.     struct pollfd fds[1];
  18.     int ret=0;
  19.     fds[0].fd=fd;
  20.     fds[0].events=POLLIN | POLLRDNORM;
  21.     ret=poll(fds,1,10*1000);
  22.     if(ret>0 && (fds[0].revents & POLLIN) && (fds[0].revents & POLLRDNORM))
  23.     {
  24.       printf("start to read..\n");
  25.       read(fd,buf,50);
  26.       printf("read data: %s\n",buf);
  27.     }
  28.     if(ret==0)
  29.     {
  30.       printf("wait timeout!\n");
  31.     }
  32.     close(fd);
  33.    return 0;
  34. }
阅读(1899) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~