驱动篇:异步通知与异步 I/O(二)
发布日期:2021-06-29 11:34:48
浏览次数:2
分类:技术文章
本文共 1791 字,大约阅读时间需要 5 分钟。
驱动篇:异步通知与异步 I/O(二)
1.信号的释放
在设备驱动和应用程序的异步通知交互中,仅仅在应用程序端捕获信号是不够的,因为信号没有的源头在设备驱动端。因此,应该在合适的时机让设备驱动释放信号,在设备驱动程序中增加信号释放的相关代码。为了使设备支持异步通知机制,驱动程序中涉及以下 3 项工作: l 支持 F_SETOWN 命令,能在这个控制命令处理中设置 filp->f_owner 为对应 进程 ID。不过此项工作已由内核完成,设备驱动无须处理。 l 支持 F_SETFL 命令的处理,每当 FASYNC 标志改变时,驱动程序中的 fasync() 函数将得以执行。因此,驱动中应该实现 fasync()函数。 l 在设备资源可获得时,调用 kill_fasync()函数激发相应的信号。 驱动中的上述 3 项工作和应用程序中的 3 项工作是一一对应的,图 9.2 所示为异步通知处理过程中用户空间和设备驱动的交互 设备驱动中异步通知编程比较简单,主要用到一项数据结构和两个函数。数据结构是 fasync_struct 结构体,两个函数分别如下处理 FASYNC 标志变更的函数。int fasync_helper(int fd, struct file *filp,int mode, struct fasync_struct **fa);释放信号用的函数。void kill_fasync(struct fasync_struct **fa, int sig, int band);
和其他的设备驱动一样,将 fasync_struct 结构体指针放在设备结构体中仍然是最佳选择,代码清单 9.3 给出了支持异步通知的设备结构体模板。
struct xxx_dev{ struct cdev cdev; /*cdev 结构体*/...struct fasync_struct *async_queue; /* 异步结构体指针 */};
在 设 备 驱 动 的 fasync() 函 数 中 , 只需要简单地将该函 数 的 3 个参数以及fasync_struct 结构体指针的指针作为第 4 个参数传入 fasync_helper()函数即可。
支持异步通知的设备驱动 fasync()函数的模板
static int xxx_fasync(int fd, struct file *filp, int mode) { struct xxx_dev *dev = filp->private_data;return fasync_helper(fd, filp, mode, &dev->async_queue); }
在设备资源可以获得时,应该调用 kill_fasync()释放 SIGIO 信号,可读时第 3 个参数设置为 POLL_IN,可写时第 3 个参数设置为 POLL_OUT。
static ssize_t xxx_write(struct file *filp, const char _ _user *buf,size_t count,loff_t *f_pos) { struct xxx_dev *dev = filp->private_data; ... /* 产生异步读信号 */ if (dev->async_queue)kill_fasync(&dev->async_queue, SIGIO, POLL_IN);...}
最后,在文件关闭时, 即在设备驱动的 release()函数中,应调用设备驱动的 fasync()
函数将文件从异步通知的列表中删除。代码清单 9.6 给出了支持异步通知的设备驱动 release()函数的模板。最后,在文件关闭时, 即在设备驱动的 release()函数中,应调用设备驱动的 fasync()函数将文件从异步通知的列表中删除
static int xxx_release(struct inode *inode, struct file *filp) { struct xxx_dev *dev = filp->private_data; /* 将文件从异步通知列表中删除 */ xxx_fasync(-1, filp, 0); ... return 0; }
转载地址:https://blog.csdn.net/zytgg123456/article/details/110001648 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月18日 04时34分56秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
PCB元器件摆放不可忽略的10个技巧
2019-04-29
掌握AI核心技术没有秘籍,能自己创造就是王道
2019-04-29
大学老师的月薪多少?实话实说:4万多一点……
2019-04-29
2020年电赛题目,命题专家权威解析!
2019-04-29
如何掌握“所有”的程序语言?没错,就是所有!
2019-04-29
39岁单身程序员入住养老院
2019-04-29
写论文,这个神器不能少!
2019-04-29
我在哥大读博的五年,万字总结
2019-04-29
本科、硕士、博士,究竟有何区别?
2019-04-29
如果我的实验室也这样布置,那多好。
2019-04-29
现在做硬件工程师还有前途吗?
2019-04-29
用 50 种编程语言写“Hello,World!”
2019-04-29
GD32替换STM32,这些细节一定要知道。
2019-04-29
华为员工离职心声:菊厂15年退休,感恩,让我实现了财务自由!
2019-04-29
春晚上的“拓荒牛”
2019-04-29
嵌入式驱动自学者的亲身感受,有什么建议?
2019-04-29
华为被超越!这家公司成中国最大智能手机制造商,不是小米!
2019-04-29
腾讯机器狗,站起来了!
2019-04-29
我用自己创造的深度学习框架进入腾讯,爽!
2019-04-29
芯片为什么持续缺货?
2019-04-29