Linux_12th_异步通知

原创 2017年01月03日 08:22:48

异步通知:

之前的三种读取按键电平状态的方法分别是:查询法、中断法、中断+Poll机制。

这三种方法都需要应用程序主动去读取,我们可以进一步改进,
如果应用程序可以休眠或者做别的事情,当发生按键中断时,驱动中的中断服务函数来主动提醒应用程序去读取就好了。
这个设想可以通过驱动程序给应用程序发信号的方法来实现。
首先明确,目的? 当按键按下时,驱动程序去提醒应用程序读取按键值。(即实现驱动和应用之间的异步通知)
 1.怎么做?    使用信号机制来实现,也就是发信号。
 2.谁发?        驱动程序发信号。
 3.怎么发?    使用kill_fasync
 4.发给谁?    发给应用程序。(应用程序事先要告诉驱动自己的PID)
 5.收到后做什么?  应用程序在信号处理函数中处理要做的工作。
根据以上几点来写出支持异步通知功能的驱动和应用程序。
当中断发生时,进入中断服务函数,将按键值记录下来,然后唤醒进程,并且使用kill_fasync(&buttons_async, SIGIO, POLL_IN)给进程发信号。
第一个参数是一个结构体,buttons_async结构体中显然包含应用程序发给驱动的那个PID;第二个参数表示信号的类别,SIGIO只是一个数字29;
第三个参数表示原因,POLL_IN表示有数据等待读取。
那么在中断发生之前,需要对buttons_async结构体进行初始化。
我们在驱动fasync函数中使用fasync_helper(fd, file, on, &buttons_async)函数来初始化buttons_async结构体。
这就是“谁发”和“怎么发”。
接下来,“发给谁”。
当然是发给应用程序,那应用程序首先得把自己的PID告诉驱动,应用程序通过fcntl这个系统调用把进程ID告诉驱动,fcntl(fd, F_SETOWN, getpid());
Oflags = fcntl(fd, F_GETFL);   
fcntl(fd, F_SETFL, Oflags | FASYNC);  // 改变fasync标记,最终会调用到驱动的faync > fasync_helper:初始化/释放buttons_async结构体
最后,“收到后做什么”
应用程序处于休眠状态,当驱动唤醒进程,并发送信号时,应用程序就会调用信号处理函数,我们需要先调用signal函数来指定我们自己实现的信号处理函数。
signal(SIGIO, my_signal_fun);

在my_signal_fun函数中使用read函数来读取我们在中断服务函数中记录好的按键电平。




  

微信支付,异步通知

微信公众号配置共五个地方: 1、设置key:微信商户平台——账户设置——API安全——密钥设置 2、页面授权域名:用来过的openID,公众号设置——功能设置——设置【网页授权域名】(【js安全域名】...
  • myfmyfmyfmyf
  • myfmyfmyfmyf
  • 2016年12月05日 10:20
  • 4981

支付宝异步通知处理

支付宝异步通知是为防止网络不稳定,订单出现丢失的情况进行的处理,同时当交易成功的时候就异步处理本程序的业务...
  • u012603567
  • u012603567
  • 2015年01月28日 17:14
  • 1743

关于支付宝异步通知的状态

关于支付宝异步通知的状态 刚开始接入支付宝支付的时候,就看到支付宝有几个异步通知的状态,其他的状态还理解,但是有两个状态的作用我感觉好像是有点重复,分别是TRADE_SUCCESS(交易成功)、TRA...
  • mrsbai
  • mrsbai
  • 2016年01月07日 19:47
  • 2205

【java web spring mvc】服务端 微信支付+微信异步通知【精】

首先 这个微信支付 官网的demo 是有bug的 研究了好几天 吸取了一些大神的指点才成功,还有csdn一些人发的代码都不全太坑,资源还少,今天我就整合一下,把我的一些心得分享给大家 。 之前遇...
  • qq_29739821
  • qq_29739821
  • 2016年12月05日 16:29
  • 7197

Linux的fasync驱动异步通知详解

首先还是先从init函数来总结:该驱动是一混杂设备驱动模型来写的,这个主要是借鉴网上的好多资料都是一这种模式来写的,Linux里面misc混杂设备驱动的主设备号是为10的驱动设备,init模块首先是用...
  • coding__madman
  • coding__madman
  • 2016年07月07日 17:43
  • 2444

关于java支付宝接口的异步通知的问题

在做java版本的支付宝接口的时候,最初是遇到了这样的问题,就是说,在直接的扫码支付,或者是直接的登录账号支付,是没有问题的, 但是,在这样的一种情况下是出现了一个问题, 我web端调用支...
  • xyw591238
  • xyw591238
  • 2015年12月24日 16:24
  • 4793

第三方支付异步通知的陷阱

用户下单后调用第三方支付付款,然后接收第三方支付的异步通知,以便确认支付是否成功。 如下图   但异步通知可能由于网络原因,或者应用服务崩溃没有接收到。为了应对这种情况需要后台创建一个定时任务去调...
  • j16421881
  • j16421881
  • 2017年12月03日 20:16
  • 141

异步通知机制内核实现 及 驱动编写 (重要)

转载于: http://blog.csdn.net/wenqian1991/article/details/50333655 基本没有修改过,特此标注 /* *1.概念: 异...
  • zhang2531
  • zhang2531
  • 2016年11月24日 16:36
  • 340

支付宝异步通知原理

支付宝异步通知原理
  • chmashin
  • chmashin
  • 2015年11月13日 21:31
  • 600

使用信号实现异步通知机制的例子

include #include #include #include #include #include #define MAX_LEN 100 //信号SIGIO的处理函数 void...
  • buaa_shang
  • buaa_shang
  • 2013年06月15日 21:20
  • 1848
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux_12th_异步通知
举报原因:
原因补充:

(最多只允许输入30个字)