对linux下异步通知fasync的理解
来源:互联网 发布:胆拖式旋转矩阵关注法 编辑:程序博客网 时间:2024/05/16 17:25
异步通知,的确是一种很好处理机制,熟练掌握这种手段,对我们写高质量的应用程序很有帮助。下面说说对它的理解:
异步通知,就是让驱动去告诉应用,底层硬件发生了什么事,而不是应用主动地去查询驱动,这对系统的性能有一个很大的提升。
首先,在驱动中
内核首先定义一个结构体struct fasync_struct,这个结构体用来存放对应设备文件的信息(如fd, filp)并交给内核来管理。一但收到信号,内核就会在这个所谓的异步队列头找到相应的文件(fd),并在filp->owner中找到对应的进程PID,这样就确定了向谁发。不过,此时fd, filp都还不确定,这就需要借助于fasync_helper(fd, filp, mode, &dev->async_queue),将fd,filp和定义的结构体传给内核,这样就完成了fd、filp、结构体三者的衔接。
而fasync_helper则需要通过ops结构体的fasync成员调用 int test_fasync (int fd, struct file *filp, int mode) ,在后者中完成对fasync_helper的调用,从而完成对异步队列的填充。
从这个过程中,也可以看到,哪个进程完成对ops成员fasync成员的调用,就会把fd、filp传给异步队列,kill_fasync发出信号就会到这个进程中,这就是驱动层次的理解。
其次,就是在应用层次
首先,要用fcntl对此文件进行设置,
fcntl(fd, F_SETOWN, getpid());设置接收SIGIO信号的进程组
Oflags = fcntl(fd, F_GETFL); 得到现在文件的标志位
fcntl(fd, F_SETFL, Oflags | FASYNC);对当前文件的标志位加上一个FASYNC属性,每当FASYNC标志改变时,驱动程序中的fasync()函数将得以执行。
然后就是应用程序得到SIGIO信号后,要绑定新的操作函数
signal(SIGIO, my_signal_fun);
这样就完成了异步通信的过程,当驱动发送kill_fasync时就会在应用程序中调用my_signal_fun函数去处理。
- 对linux下异步通知fasync的理解
- linux下异步通知fasync的理解
- Linux异步通知fasync
- Linux异步通知fasync
- linux 异步通知fasync
- Linux异步通知 fasync
- Linux异步通知fasync
- Linux异步通知 fasync
- Linux异步通知fasync
- Linux异步通知 fasync
- Linux异步通知fasync
- Linux的fasync驱动异步通知详解
- 浅析 Linux fasync 异步通知
- 异步通知fasync的工作流程
- 异步通知fasync
- 异步通知fasync
- 异步通知fasync
- 异步通知fasync
- MB1A MB1B MB1C MB11 MIGO的区别解析
- JavaScript 中用"=="还是"===" 解答
- OpenSessionInView
- OpenSessionInViewFilter线程绑定session
- 关于程序员面试宝典中5.8节面试例题:编写一个函数,实现把C/C++程序代码中的注释去掉……答案的分析
- 对linux下异步通知fasync的理解
- b is not in the spans of the columns of the martix A
- Android各个版本命名(从1.5到6.0)
- POJ 1742 Coins (背包)
- C#读取Excel到DataSet的方法
- [erlang学习] 用observer远程监控节点 (随笔简记)
- 理解COM
- poj1039 Pipe (计算几何)
- 手机移动电源 充电宝