Linux驱动学习笔记:异步通知_第1页
Linux驱动学习笔记:异步通知_第2页
Linux驱动学习笔记:异步通知_第3页
Linux驱动学习笔记:异步通知_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第第页Linux驱动学习笔记:异步通知

什么是异步通知

异步通知在(Linux)的实现中是通过(信号),而信号是在软件层次上对中断机制的一种(模拟)。这种机制和中断非常类似,所以可以以中断的思想来理解这一过程,信号其实就相当于应用层的中断。

信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。

如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。

异步通知和异步IO的区别

异步通知:当资源可获得时,由驱动程序向应用层发送一个信号,主动通知应用程序,再由应用程序发起访问。

异步IO:主动获取设备的资源信息,首先发起一个IO操作请求,资源可用时,应用层注册的回调函数会被主动调用。但是异步通知不能直接调用应用层注册的回调函数,而是由驱动程序向应用层发送一个信号。

信号含义

信号名含义默认操作SIGHUP该信号在用户终端连接(正常或非正常)结束时发出,通常是在终端的控制进程结束时,通知同一会话内的各个作业与控制终端不再关联。终止SIGINT该信号在用户键入INTR字符(通常是Ctrl-C)时发出,终端驱动程序发送此信号并送到前台进程中的每一个进程。终止SIGQUIT该信号和SIGINT类似,但由QUIT字符(通常是Ctrl-\\)来控制。终止SIGILL该信号在一个进程企图执行一条非法指令时(可执行文件本身出现错误,或者试图执行数据段、堆栈溢出时)发出。终止SIGFPE该信号在发生致命的算术运算错误时发出。这里不仅包括浮点运算错误,还包括溢出及除数为0等其它所有的算术的错误。终止SIGKILL该信号用来立即结束程序的运行,并且不能被阻塞、处理和忽略。终止SIGALRM该信号当一个(定时器)到时的时候发出。终止SIGSTOP该信号用于暂停一个进程,且不能被阻塞、处理或忽略。暂停进程SIGTSTP该信号用于暂停交互进程,用户可键入SUSP字符(通常是Ctrl-Z)发出这个信号。暂停进程SIGCHLD子进程改变状态时,父进程会收到这个信号忽略SIGABORT该信号用于结束进程终止当应用层接收到一个信号时,可以对信号执行忽略、捕捉和缺省三种操作:

忽略信号:对信号不做任何处理,但是有两个信号不能忽略:即SIGKILL及SIGSTOP。

捕捉信号:定义信号处理函数,当信号发生时,执行相应的处理函数。

缺省信号:执行Linux对该信号的默认操作

应用层使用信号

以下是应用层捕捉SIGIO信号的简单示例:

voidinput_handler(intsignum){//如果驱动发送了SIGIO信号,在此处理printf("recivefrom%d\\n",signum);}intmain(){intfd,oflags;fd=open("/dev/global",O_RDWR,S_IRUSR|S_IWUSR);if(fd!=-1){//启动信号机制signal(SIGIO,input_handler);//设置SIGIO信号的处理函数fcntl(fd,F_SETOWN,get(pi)d());//将进程ID赋值给filp->f_owneroflags=fcntl(fd,F_GETFL);fcntl(fd,F_SETFL,oflags|FASYNC);//驱动的fasync方法被调用while(1){sleep(1000);}}}当应用层F_SETOWN,驱动什么都没做,内核只是将进程的ID赋值给filp->f_owner;当应用层F_SETFL被执行来打开FASYNC,驱动的fasync方法被调用.当数据到达,驱动向进程发出一个SIGIO信号驱动如何实现异步信号

驱动的实现主要用到一个结构体和两个函数:

fasync_struct结构体:

structfasync_struct{spinlock_tfa_lock;intmagic;intfa_fd;structfasync_struct*fa_next;/*singlylinkedlist*/structfile*fa_file;structrcu_he(ad)fa_rcu;};函数:

fasync_helper():用于处理FASYNC标志变更

fasync_helper()函数是用来初始化fasync_struct结构体变量,并设置异步通知队列的

intfasync_helper(intfd,//文件描述符structfile*filp,//文件指针inton,structfasync_struct**fapp);//要设置的结构第三个参数on表示设置还是删除,on为真时初始化,为假时(0),移除.

kill_fasync():发送信号

voidkill_fasync(structfasync_struct**fp,intsig,intband);fp:是已初始化的fasync_struct数据结构

sig:要发送的信号

band:在可读时设置为POLL_IN,在可写时设置为POLL_OUT;

驱动实例

staticstructfasync_struct*btn_fasync;staticirqreturn_tbtn_irq_handler(intirq,void*dev){structbtn_t*p=(structbtn_t*)dev;//发送信号kill_fasync(returnIRQ_HANDLED;}staticintbtn_drv_fasync(intfd,structfile*fp,inton){//初始化btn_fasync结构,并添加到异步通知列表中returnfasync_helper(fd,fp,on,}staticintbtn_drv_close(structinode*inode,structfile*filp){if(filp->f_flags//将文件从异步通知的列表中删除return0;}staticstructfile_opera(ti)onsbtn_ops={.release=btn_drv_close,.fasync=btn_drv_fasync,};主要步骤:

1、构造structfasync_struct链表的头

2、实现fasync接口函数,调用fasync_helper函数来构造structfasync_struct节点,并加入链表。

3、在资源可用时,调用kill_fasync发送信号,并设置资源的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论