曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 7381|回复: 1
打印 上一主题 下一主题

输入输出复用的实现

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2009-11-9 17:44:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
select() 和 poll() 函数可以实现应用程序的输入输出复用函数。设备函数中的 poll() 内容结构较为简单,但多数设备驱动程序种的显示方式基本相同。关于应用程序里的 select() 和 poll() 相关内容见:
http://www.groad.net/bbs/read.php?tid-1251.html
http://www.groad.net/bbs/read.php?tid-1064.html

在驱动程序里实现输入输出复用不区分 select() 和 poll() 函数。file_operation 的 poll 域的函数结构如下:
unsigned int xxx_poll (struct file *file, poll_table *wait);

应用程序调用 select() 函数或 poll() 函数时,设备驱动程序种的 poll() 函数有两种作用:
      在内核的 poll_table 上注册成为 polling 对象的事件对应的等待队列。
      内核向设备文件返回输入输出复用处理的 mask 值。

设备驱动程序中,实现 poll() 函数的方法具有一定的标准结构,如下所示:
DECLARE_WAIT_QUEUE_HEAD(WaitQueue_Read);
DECLARE_WAIT_QUEUE_HEAD(WaitQueue_Write);
... ...
... ...
unsined int xxx_poll (struct file *file, poll_table *wait)
{
       int mask = 0;

      poll_wait (file, &WaitQueue_Read, wait);
      poll_wait (file, &WaitQueue_Write, wait);

      if (存在需要处理的输入数据)
                   mask |= (POLL | POLLRDNORM);
      if (可输出)
                   mask |= (POLLOUT | POLLWRNORM);

     return (mask);
}

相关实例:http://www.groad.net/bbs/read.php?tid-1353.html

0

主题

1

帖子

0

积分

初学弟子

积分
0
沙发
发表于 2011-11-7 21:25:05 | 只看该作者
哦~~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 03:25 , Processed in 0.076049 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表