fasync的总结

news/2024/7/3 11:25:45 标签: struct, kill, application, file, socket, linux

 

fasync这个东西就是为了使驱动的读写和application的读写分开,使得application可以在驱动读写时去做别的事,通过kill_fasync

(kill_fasync(&async, SIGIO, POLL_IN);)SIGIO信号给应用,应用通过fcntl把自己这个SIGIO的信号换成自己的响应函数,当驱动发

(kill_fasync(&async, SIGIO, POLL_IN);)给应用时应用就调用了自己的handler去处理。fasync_helper作用就是初始化fasync这个东西,包括分配内存和设置属性。最后记得在驱动的release里把fasync_helper初始化的东西free掉。

POLL_IN POLL_OUT

=================================================================================

驱动程序向用户程序发信号
---------------------------------------------

    当设备有IO事件发生,就有机制保证向应用进程发送信号,显然设备驱动程序扮演重要角色,实际终端tty、网络socket等的标准实现已经包括了实时信号驱动的支持,所以,在Linux中它们可以如上直接使用。但有些设备的驱动程序还并没有支持,所以需要定制设备驱动程序。以下两个API应该是可以屏蔽所有相关琐碎操作(类似send_sig())的标准接口:
    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()接口的实现(该函数将本进程登记到async_queue上去) 当一个打开的文件FASYNC标志变化时(调用fcntl()函数,设置FASYNC文件标志时)fasync()接口将被调用。


   
struct kpp_dev {
       
struct cdev cdev;
       
struct fasync_struct *async_queue;
   
};
    

   
static int kpp_fasync(int fd, struct file *filp, int mode)
   
{
       
struct kpp_dev *dev = filp->private_data;
       
return fasync_helper(fd, filp, mode, &dev->async_queue);
   
}

    事件发生的时机,就是中断服务程序或相应的软中断中调用
kill_fasync():
   
if (dev->async_queue)
       
kill_fasync(&dev->async_queue, SIGIO, POLL_IN);
    如果是写操作,就是POLL_OUT。注意,无论用户进程设定了什么期望的信号,在这个环节,发送的一般就是SIGIO。注意在设备文件关闭(release方法)时,注意执行fasync(),使得本文件的操作从上述的设备异步事件等待链表中剥离。


    static int kpp_release(struct inode *inode, struct file *filp)
   
{
       
kpp_fasync(-1, filp, 0);
       
return 0;
    }

 

 

kill">

http://www.niftyadmin.cn/n/1713866.html

相关文章

什么是jiffy?

在学习linux源码时,对jiffy这个概念比较迷惑。查了一些资料,这个还是讲得比较好的,与君共享。 What’s the jiffy? 在电气中,jiffy是指交流电的周期。如果我们打开翻译软件输入jiffy,会得到意思:一会儿&…

开始找工作了

就要开始找工作了,今天去面试了一家公司,只是觉得那家公司有点小,面试进行的还算顺利,只是它想让我赶快实习,我还没想到要马上复习,我想再找一下,最好拿到几份offer,心里踏实了再说&…

一个守护进程的例子

实现守护进程的完整实例&#xff08;每隔10s在/tmp/dameon.log中写入一句话&#xff09;&#xff1a; #include<stdio.h> #include<stdlib.h> #include<string.h> #include<fcntl.h> #include<sys/types.h> #include<unistd.h> #…

D-Bus学习笔记

1. 进程间使用D-Bus通信 D-Bus是一种高级的进程间通信机制&#xff0c;它由freedesktop.org项目提供&#xff0c;使用GPL许可证发行。D-Bus最主要的用途是在Linux桌面环境为进程提供通信&#xff0c;同时能将Linux桌面环境和Linux内核事件作为消息传递到进程。D-Bus的主要概率…

谈汽车CAN总线技术

围绕“汽车为什么选择了CAN总线技术&#xff1f;汽车CAN总线技术到底是怎么一回事&#xff1f;采用汽车CAN总线技术有哪些优点&#xff1f;汽车总线的发展趋势”等问题作了一个浅短的介绍&#xff1a; 1.汽车为什么选择了CAN总路线技术? 现在总线技术有很多种。从成本上讲&…

随笔——珍惜拥有的一切

今天晚上有个很不平常的经历&#xff0c;晚上打算去洗衣服&#xff0c;在收拾脏衣服的时候&#xff0c;不小心把眼镜碰掉了&#xff0c;为了赶紧洗衣服去&#xff0c;就没有戴眼镜&#xff0c;洗完后一戴眼镜发现不对劲&#xff0c;仔细一看原来是掉了一只镜片&#xff0c;因为…

Wine使用手册

转载&#xff1a;http://www.bitscn.com/linux/technic/200802/127277.html 用了段时间的UBUNTU&#xff0c;感觉很好&#xff01;可是工作的时候还是要用到 windows软件&#xff0c;于是乎&#xff0c;采取折中方案&#xff1a;安装UBUNTU下的WINE。 一直苦于没有一篇像样的…

Linux源码安装过程中选项—prefix的作用

在linux和unix环境中&#xff0c;源码安装是最常用的软件安装方式&#xff0c;一些软件除了提供源码外&#xff0c;也提供各种发行版的二进制安装包&#xff08;如基于redhat包 管理工具的rpm包&#xff09;&#xff0c;但强烈建议使用源码安装方式。原因是&#xff1a;&#x…