异步通知《来自Linux驱动程序开发实例》
您所在的位置:读书频道 > 操作系统 > Linux > 1.2.8 异步通知
1.2.8 异步通知
综合评级:
想读(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从相关的进程列表中添加或去除异步通知关联。
- int fasync_helper(int fd, struct file *filp, int mode, struct fasync_struct **fa);
当数据到达时 kill_fasync函数将被用来通知相关的进程:
- void kill_fasync(struct fasync_struct **fa, int sig, int band);
例1.8 异步通知实例
代码见光盘\src\1drivermodel\1-8fasync。驱动层代码如下:
- struct simple_dev *simple_devices;
- static unsigned char simple_inc=0;
- static struct timer_list simple_timer;
- static struct fasync_struct *fasync_queue=NULL;
- int simple_open(struct inode *inode, struct file *filp)
- {
- struct simple_dev *dev;
- dev = container_of(inode->i_cdev, struct simple_dev, cdev);
- filp->private_data = dev;
- simple_timer.function = &simple_timer_handler;
- simple_timer.expires = jiffies + 2*HZ;
- add_timer (&simple_timer);
- printk("add_timer...\n");
- return 0;
- }
- //异步通知处理函数
- static int simple_fasync(int fd, struct file * filp, int mode)
- {
- int retval;
- printk("simple_fasync...\n");
- retval=fasync_helper(fd,filp,mode,&fasync_queue);
- if(retval<0)
- return retval;
- return 0;
- }
- int simple_release(struct inode *inode, struct file *filp)
- {
- simple_fasync(-1, filp, 0);
- return 0;
- }
- struct file_operations simple_fops = {
- .owner = THIS_MODULE,
- .open = simple_open,
- .release= simple_release,
- .fasync= simple_fasync,
- };
当数据来临时通知应用层:
- static void simple_timer_handler( unsigned long data)
- {
- printk("simple_timer_handler...\n");
- if (fasync_queue)
- {
- //POLL_IN为可读,POLL_OUT为可写
- kill_fasync(&fasync_queue, SIGIO, POLL_IN);
- printk("kill_fasync...\n");
- }
- return ;
- }
POLL_IN表示设备可读,POLL_OUT表示设备可写。应用层参考代码如下:
- int fd;
- void fasync_handler(int num)
- {
- printf("fasync_handler entering\n");
- }
- void main()
- {
- int i=2;
- char data[256];
- int oflags=0;
- int retval;
- signal(SIGIO, fasync_handler);//注册信号处理函数
- fd=open("/dev/fcn",O_RDWR);
- if(fd==-1)
- {
- perror("error open\n");
- exit(-1);
- }
- printf("open /dev/fcn successfully\n");
- //使能了异步的通知到当前进程
- fcntl(fd, F_SETOWN, getpid());
- oflags=fcntl(fd, F_GETFL);
- fcntl(fd, F_SETFL, oflags | FASYNC);//修改文件标志
- while(1);
- close(fd);
- }
运行结果如下:
- [root@urbetter /home]# insmod demo.ko
- [root@urbetter /home]# mknod /dev/fcn c 226 0
- [root@urbetter /home]# ./test
- add_timer...
- open /dev/fcn successfullysimple_fasync...
- simple_timer_handler...
- kill_fasync...
- fasync_handler entering
异步通知《来自Linux驱动程序开发实例》相关推荐
- poll接口《来自Linux驱动程序开发实例》
您所在的位置:读书频道 > 操作系统 > Linux > 1.2.7 poll接口 1.2.7 poll接口 2012-05-22 13:38 冯国进 机械工业出版社 我要评论(0) ...
- 嵌入式Linux驱动程序开发
嵌入式Linux驱动程序开发 1.设备驱动程序的概念... 2 2.处理器与设备间数据交换方式... 2 21.查询方式... 2 2.2.中断方式... 3 2.3.直接访问内存(DMA)方式... ...
- 基于DM6467的TVP7002 Linux驱动程序开发
在Linux中,使用V4L2框架管理所有的视频编解码设备.针对我们开发板的V4L2框架结构已经在之前的TVP5150驱动程序编写和OV5642驱动程序编写的说明文档中进行了详细的分析,所以这里不再对整 ...
- 基础服务器 IO 模型 Proactor 模型 Reactor 模型 IO 多路复用 异步 IO 模型 Linux 服务器开发 网络编程服务器模型
本文主要记录服务器的 IO 模型的类型(从多路复用,异步 IO 讲到 Proactor Reactor 模型),包括 Real World nginx 和 apache ,kafka 等分析,配备自洽 ...
- linux驱动程序开发指南-字符驱动介绍
概述: 在linux系统中设备驱动程序通常是作为应用层和设备层的中间层软件,驱动程序的主要功能是实现应用层访问硬件设备的具体操作接口,通过调用驱动程序,上层应用程序可以采用统一的接口访问各种硬件设备. ...
- Linux驱动程序开发 - 设备IO
序言: 前面我们提到,设备驱动程序的主要功能操作设备,更准确的说就是如何操作设备寄存器或设备内存.不同的计算机体系结构提供了不同的设备操作接口,主要就是IO端口映射(Ports)或IO内存映射(Mem ...
- 4412在linux环境开发实例,Exynos4412交叉编译环境搭建
交叉编译:在PC机(x86平台)上开发程序,在ARM板上运行,提高开发.编译速度. 环境: Tiny4412SDK1506开发板 需要软件: arm-linux-gcc-4.5.1-v6-vfp-20 ...
- Linux内核开发之异步通知与异步I/O《来自linux设备开发详解》
阻塞I/O意味着一直等待设备可访问再访问,非阻塞I/O意味着使用poll()来查询是否可访问,而异步通知则意味着设备通知应用程序自身可访问.(异步通知:很简单,一旦设备准备好,就主动通知应用程序,这种 ...
- linux编写驱动后write已杀死_《Linux4.0设备驱动开发详解》笔记--第九章:Linux设备驱动中的异步通知与同步I/O...
在设备驱动中使用异步通知可以使得对设备的访问可进行时,由驱动主动通知应用程序进行访问.因此,使用无阻塞I/O的应用程序无需轮询设备是否可访问,而阻塞访问也可以被类似"中断"的异步通 ...
最新文章
- php网课资源百度云盘_安全中国PHP网站开发工程师就业指导班 35课 附课件、源码,全套视频教程学习资料通过百度云网盘下载...
- Windows7中搭建Android x86_64及armv8-a操作步骤
- Android ViewGroup等容器控件的使用
- 又见灵异事件,li中的span右浮动遇到的问题
- java第一章Java语言概述和入门程序
- 【大白话系列】带你进入网络的世界【都说计网难,一篇即可激发你的兴趣】
- 【转】java string类的方法及说明
- OpenCV:使用OpenCV3随机森林进行统计特征多类分析
- 【语义分割】ASPP:Rethinking Atrous Convolution for Semantic Image Segmentation
- LINUX 下tcp 和 udp 套接字收发缓冲区的大小决定规则 .
- Gradle中的buildScript代码块
- Eclipse使用Maven插件创建Web项目时出错:Could not resolve archetype org.apache.maven.archetypes
- 【2017年第1期】CCF大专委2017年大数据发展趋势预测
- win7计算机未连接网络连接,解决win7能上网但是网络图标显示未连接的方法-win7之家...
- 操作系统高响应比优先调度算法代码_进程调度
- python学习笔记__Python的安装
- 通讯工程考研考计算机专业跨度大么,通信工程专业,与自动化专业差别大吗?考研可以跨考吗?...
- 软件工程中国大学慕课mooc北京大学 答案
- 磁盘清理 磁盘分析 磁盘空间 磁盘大小 可视化【软件】
- 如何调试delphi的Access violation at address错误
热门文章
- mysql convertgrp_Mysql中几种sql的常见用法
- jieba自定义分词规则与多进程切词
- 解决numpy报错UFuncTypeError: Cannot cast ufunc ‘add‘ output from dtype(‘x‘) to dtype(‘x‘)
- pandas apply()函数传参,与解决TypeError: xxxx() takes 2 positional arguments but 3 were given报错
- 金蝶记账王登录显示连接金蝶云服务器异常,金蝶KIS记账王系统初始化常见问题...
- cx是什么简称_80年的5角,在纸币收藏界简称为8005
- 软件架构之道的一次感悟
- 网页内容切换效果实现的15个jQuery插件
- HDU 1004 Let the Balloon Rise (map)
- ArcGIS的BLOB字段与Access数据库BLOB字段的交换