您所在的位置:读书频道 > 操作系统 > Linux > 1.2.8 异步通知

1.2.8 异步通知

2012-05-22 13:38 冯国进 机械工业出版社 我要评论(0) 字号:T |T

综合评级:

想读(9)  在读(2)  已读(1)  品书斋鉴(1)  已有12人发表书评

《Linux驱动程序开发实例》第1章 Linux设备驱动程序模型,本章主要介绍Linux内核中的驱动程序模型,包括三类设备的驱动程序、proc文件系统、Sysfs文件系统、Kobject等内容。本节为大家介绍异步通知。

AD: 51CTO云计算架构师峰会 抢票进行中!

1.2.8  异步通知

驱动程序与应用程序不能直接通信,如果设备已经准备好数据,可以采用异步通知的方式通知应用层来读取,这样应用程序就不需要一直查询设备的状态。要支持异步通知,需要实现设备驱动程序的fasync接口。当一个打开的文件的FASYNC标志变化时file_operations ->fasync()接口将被调用。file_operations ->fasync函数会调用fasync_helper从相关的进程列表中添加或去除异步通知关联。

  1. int fasync_helper(int fd, struct file *filp, int mode, struct fasync_struct **fa);

当数据到达时 kill_fasync函数将被用来通知相关的进程:

  1. void kill_fasync(struct fasync_struct **fa, int sig, int band);

例1.8  异步通知实例

代码见光盘\src\1drivermodel\1-8fasync。驱动层代码如下:

  1. struct simple_dev *simple_devices;
  2. static unsigned char simple_inc=0;
  3. static struct timer_list simple_timer;
  4. static struct fasync_struct *fasync_queue=NULL;
  5. int simple_open(struct inode *inode, struct file *filp)
  6. {
  7. struct simple_dev *dev;
  8. dev = container_of(inode->i_cdev, struct simple_dev, cdev);
  9. filp->private_data = dev;
  10. simple_timer.function = &simple_timer_handler;
  11. simple_timer.expires = jiffies + 2*HZ;
  12. add_timer (&simple_timer);
  13. printk("add_timer...\n");
  14. return 0;
  15. }
  16. //异步通知处理函数
  17. static int simple_fasync(int fd, struct file * filp, int mode)
  18. {
  19. int retval;
  20. printk("simple_fasync...\n");
  21. retval=fasync_helper(fd,filp,mode,&fasync_queue);
  22. if(retval<0)
  23. return retval;
  24. return 0;
  25. }
  26. int simple_release(struct inode *inode, struct file *filp)
  27. {
  28. simple_fasync(-1, filp, 0);
  29. return 0;
  30. }
  31. struct file_operations simple_fops = {
  32. .owner =    THIS_MODULE,
  33. .open =     simple_open,
  34. .release=   simple_release,
  35. .fasync=    simple_fasync,
  36. };

当数据来临时通知应用层:

  1. static void simple_timer_handler( unsigned long data)
  2. {
  3. printk("simple_timer_handler...\n");
  4. if (fasync_queue)
  5. {
  6. //POLL_IN为可读,POLL_OUT为可写
  7. kill_fasync(&fasync_queue, SIGIO, POLL_IN);
  8. printk("kill_fasync...\n");
  9. }
  10. return ;
  11. }

POLL_IN表示设备可读,POLL_OUT表示设备可写。应用层参考代码如下:

  1. int fd;
  2. void fasync_handler(int num)
  3. {
  4. printf("fasync_handler entering\n");
  5. }
  6. void main()
  7. {
  8. int i=2;
  9. char data[256];
  10. int oflags=0;
  11. int retval;
  12. signal(SIGIO, fasync_handler);//注册信号处理函数
  13. fd=open("/dev/fcn",O_RDWR);
  14. if(fd==-1)
  15. {
  16. perror("error open\n");
  17. exit(-1);
  18. }
  19. printf("open /dev/fcn successfully\n");
  20. //使能了异步的通知到当前进程
  21. fcntl(fd, F_SETOWN, getpid());
  22. oflags=fcntl(fd, F_GETFL);
  23. fcntl(fd, F_SETFL, oflags | FASYNC);//修改文件标志
  24. while(1);
  25. close(fd);
  26. }

运行结果如下:

  1. [root@urbetter /home]# insmod demo.ko
  2. [root@urbetter /home]# mknod /dev/fcn c 226 0
  3. [root@urbetter /home]# ./test
  4. add_timer...
  5. open /dev/fcn successfullysimple_fasync...
  6. simple_timer_handler...
  7. kill_fasync...
  8. fasync_handler entering
【责任编辑:book TEL:(010)68476606】

异步通知《来自Linux驱动程序开发实例》相关推荐

  1. poll接口《来自Linux驱动程序开发实例》

    您所在的位置:读书频道 > 操作系统 > Linux > 1.2.7 poll接口 1.2.7 poll接口 2012-05-22 13:38 冯国进 机械工业出版社 我要评论(0) ...

  2. 嵌入式Linux驱动程序开发

    嵌入式Linux驱动程序开发 1.设备驱动程序的概念... 2 2.处理器与设备间数据交换方式... 2 21.查询方式... 2 2.2.中断方式... 3 2.3.直接访问内存(DMA)方式... ...

  3. 基于DM6467的TVP7002 Linux驱动程序开发

    在Linux中,使用V4L2框架管理所有的视频编解码设备.针对我们开发板的V4L2框架结构已经在之前的TVP5150驱动程序编写和OV5642驱动程序编写的说明文档中进行了详细的分析,所以这里不再对整 ...

  4. 基础服务器 IO 模型 Proactor 模型 Reactor 模型 IO 多路复用 异步 IO 模型 Linux 服务器开发 网络编程服务器模型

    本文主要记录服务器的 IO 模型的类型(从多路复用,异步 IO 讲到 Proactor Reactor 模型),包括 Real World nginx 和 apache ,kafka 等分析,配备自洽 ...

  5. linux驱动程序开发指南-字符驱动介绍

    概述: 在linux系统中设备驱动程序通常是作为应用层和设备层的中间层软件,驱动程序的主要功能是实现应用层访问硬件设备的具体操作接口,通过调用驱动程序,上层应用程序可以采用统一的接口访问各种硬件设备. ...

  6. Linux驱动程序开发 - 设备IO

    序言: 前面我们提到,设备驱动程序的主要功能操作设备,更准确的说就是如何操作设备寄存器或设备内存.不同的计算机体系结构提供了不同的设备操作接口,主要就是IO端口映射(Ports)或IO内存映射(Mem ...

  7. 4412在linux环境开发实例,Exynos4412交叉编译环境搭建

    交叉编译:在PC机(x86平台)上开发程序,在ARM板上运行,提高开发.编译速度. 环境: Tiny4412SDK1506开发板 需要软件: arm-linux-gcc-4.5.1-v6-vfp-20 ...

  8. Linux内核开发之异步通知与异步I/O《来自linux设备开发详解》

    阻塞I/O意味着一直等待设备可访问再访问,非阻塞I/O意味着使用poll()来查询是否可访问,而异步通知则意味着设备通知应用程序自身可访问.(异步通知:很简单,一旦设备准备好,就主动通知应用程序,这种 ...

  9. linux编写驱动后write已杀死_《Linux4.0设备驱动开发详解》笔记--第九章:Linux设备驱动中的异步通知与同步I/O...

    在设备驱动中使用异步通知可以使得对设备的访问可进行时,由驱动主动通知应用程序进行访问.因此,使用无阻塞I/O的应用程序无需轮询设备是否可访问,而阻塞访问也可以被类似"中断"的异步通 ...

最新文章

  1. php网课资源百度云盘_安全中国PHP网站开发工程师就业指导班 35课 附课件、源码,全套视频教程学习资料通过百度云网盘下载...
  2. Windows7中搭建Android x86_64及armv8-a操作步骤
  3. Android ViewGroup等容器控件的使用
  4. 又见灵异事件,li中的span右浮动遇到的问题
  5. java第一章Java语言概述和入门程序
  6. 【大白话系列】带你进入网络的世界【都说计网难,一篇即可激发你的兴趣】
  7. 【转】java string类的方法及说明
  8. OpenCV:使用OpenCV3随机森林进行统计特征多类分析
  9. 【语义分割】ASPP:Rethinking Atrous Convolution for Semantic Image Segmentation
  10. LINUX 下tcp 和 udp 套接字收发缓冲区的大小决定规则 .
  11. Gradle中的buildScript代码块
  12. Eclipse使用Maven插件创建Web项目时出错:Could not resolve archetype org.apache.maven.archetypes
  13. 【2017年第1期】CCF大专委2017年大数据发展趋势预测
  14. win7计算机未连接网络连接,解决win7能上网但是网络图标显示未连接的方法-win7之家...
  15. 操作系统高响应比优先调度算法代码_进程调度
  16. python学习笔记__Python的安装
  17. 通讯工程考研考计算机专业跨度大么,通信工程专业,与自动化专业差别大吗?考研可以跨考吗?...
  18. 软件工程中国大学慕课mooc北京大学 答案
  19. 磁盘清理 磁盘分析 磁盘空间 磁盘大小 可视化【软件】
  20. 如何调试delphi的Access violation at address错误

热门文章

  1. mysql convertgrp_Mysql中几种sql的常见用法
  2. jieba自定义分词规则与多进程切词
  3. 解决numpy报错UFuncTypeError: Cannot cast ufunc ‘add‘ output from dtype(‘x‘) to dtype(‘x‘)
  4. pandas apply()函数传参,与解决TypeError: xxxx() takes 2 positional arguments but 3 were given报错
  5. 金蝶记账王登录显示连接金蝶云服务器异常,金蝶KIS记账王系统初始化常见问题...
  6. cx是什么简称_80年的5角,在纸币收藏界简称为8005
  7. 软件架构之道的一次感悟
  8. 网页内容切换效果实现的15个jQuery插件
  9. HDU 1004 Let the Balloon Rise (map)
  10. ArcGIS的BLOB字段与Access数据库BLOB字段的交换