Linux学习笔记(5)异步通知机制

异步通知
读取按键的几种方式:
查询: 耗资源
中断: 一直读取
poll:   指定超时时间
共同特点:应用程序主动读取按键
异步通知:有按键按下,触发应用程序去读取按键
进程之间发送信号的实现:

kill -9 PID
sginal测试程序:
#include <stdio.h>
#include <signal.h>
void my_signal_fun(int signum)
{
    pirntf(“signal = %d, %d tiems\n” ,signum,++cnt);
}
int main(int argc, char **argv)
{
    signal(SIGUSR1, my_signal_fun);
    while(1)
    {
        sleep(1000);
    }
}
测试 kill -USER1 828  
异步通知驱动程序的要点:
    1.注册信号处理函数
    2.谁来发
    3.发给谁
    4.怎么发
目标:
    按下按键时驱动程序通知应用程序,而不是应用程序主动查询。
实现过程:   
    1.应用程序注册信号处理函数
        在应用main函数中调用 
            signal(SIGIO, my_signal_fun);
        来注册信号处理函数,同时在应用程序中定义信号处理函数:
            void my_signal_fun(int signum)
            {
                unsigned char key_val;
                read(fd, &key_val, 1);
                printf(“key_val: 0x%x\n”,key_val);
            }
    2.应用程序要告诉驱动他的PID,驱动程序通过PID把信号发送给应用程序
        首先,在驱动程序中添加 fasycn() 函数,该函数在应用程序调用 fcntl() 函数是被调用。fasync() 函数的作用的调用 fasync_helper(fd, filp, on, &button_async); 来实现绑定信号和应用程序。
        然后,在应用程序中调用 fcntl() 函数传入进程PID,并开启 ASYNC 功能。
    3.驱动程序发送信号,调用 kill_fasync
        在驱动程序的 buttons_irq() 函数中调用 kill_fasync(&button_async, SIGIO, POLL_IN); 来发送信号给应用程序。
    
对于异步通知的理解
异步通知机制实现的效果就是应用程序可以像写单片机程序一样来处理中断事件,即把事件处理放到对应的处理函数中,main函数可以处理主循环,当有通知到来是,相应的处理函数将被自动调用,这类似于单片机中的中断处理方式,可以看着是应用层的中断实现。
异步通知的目的和优势是什么?还要进一步学习!  
来自为知笔记(Wiz)
分享到: 更多
版权申明:

本站保留所有原创文章的版权,本站地址:奔跑的博客[http://www.elecbench.com]

原创文章转载时请注明出处,并添加文章所在页面的链接:http://www.elecbench.com/linux%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%ef%bc%885%ef%bc%89%e5%bc%82%e6%ad%a5%e9%80%9a%e7%9f%a5%e6%9c%ba%e5%88%b6/

本站所有 2010年3月4日 以后发表、未标明为“转载”的文章均是本站原创。

发表评论


(设置自己的个性头像)

*

申请属于你的免费顶级域名