【Linux 驱动】第六章 高级字符驱动程序操作----异步通知
来源:互联网 发布:布谷鸟软件怎么样 编辑:程序博客网 时间:2024/06/02 14:55
一,概念
异步通知:一旦设备就绪,则主动通知应用程序,应用程序根本就不需要查询设备状态。(类似于中断)信号是异步的,一个进程不必通过任何操作来等待信号的到达
在linux中,异步通知是使用信号来实现的,而在linux,大概有30种信号,比如大家熟悉的ctrl+c的sigint信号,进程能够忽略或者捕获除过SIGSTOP和SIGKILL的全部信号,当信号背捕获以后,有相应的函数来处理它。
二,应用程序角度考虑
- signal(SIGIO,&input_handler);
- fcntl(STDIN_FILENO,F_SETOWN,getpid());
- oflags = fcntl(STDIN_FILENO,F_GETFL);
- fcntl(STDIN_FILENO,F_SETFL,oflags | FASYNC);
应用程序中还有两点注意:应用程序不是所有设备都支持异步通知,通常应用程序假设只有套接字和终端才有异步通知能力;如果有多个文件可以异步通知输入的进程,应用程序需要借助poll或者select来确定输入的来源(利用FD_ISSET来判断)。
三,驱动程序角度考虑
那么驱动程序如何来实现异步信号呢?
内核已经提供了很方便的函数给我们使用,为了实现异步信号,驱动程序需要做三件事情:
1)实现fasync方法:该方法也只需要做一步,调用内核提供的fasync_helper函数,如下是scullp设备提供的实现代码:
- static int scull_p_fasync(int fd, struct file *filp,int mode)
- {
- struct scull_pipe *dev = filp->private_data;
- return fasync_helper(fd,filp,mode,&dev->async_queue);
- }
2)当数据到达时,需要实现异步通知,这时需要调用kill_fasync,当数据可读时,此时需要通知应用程序数据可读,如下是scullp设备提供的代码:
- if(dev->async_queue)
- kill_fasync(&dev->async_queue,SIGIO,POLL_IN);
如果是为写入提供异步信号,kill_fasync必为模式调用POLL_OUT。
3)在文件关闭时必须调用fasync方法,以便从活动的异步读取进程列表中删除该文件,所有在close方法中有如下调用:
- sucll_p_fasync(-1,filp,0);
四,llseeek实现
loff_t scull_llseek(struct file *filp, loff_t off, int whence){struct scull_dev *dev = filp->private_data;loff_t newpos;switch(whence) {case 0: /* SEEK_SET */newpos = off;break;case 1: /* SEEK_CUR */newpos = filp->f_pos + off;break;case 2: /* SEEK_END */newpos = dev->size + off;break;default: /* can't happen */return -EINVAL;}if (newpos < 0) return -EINVAL;filp->f_pos = newpos;return newpos;}
- 【Linux 驱动】第六章 高级字符驱动程序操作----异步通知
- 【Linux 驱动】第六章 高级字符驱动程序操作 ----ioctl
- LDD高级字符驱动程序操作-异步通知
- 【Linux 驱动】第六章 高级字符驱动程序操作 ----阻塞型I/O
- 【Linux 驱动】第六章 高级字符驱动程序操作----poll,select,epoll
- Linux设备驱动程序学习(6)-高级字符驱动程序操作[(4)异步通知fasync]
- 第六章:高级字符驱动程序操作
- 第六章--高级字符驱动程序操作
- 第六章:高级字符驱动程序操作
- Linux设备驱动程序第三版学习(8)- 高级字符驱动程序操作(续3)- 异步通知
- Linux设备驱动程序第三版学习(8)- 高级字符驱动程序操作(续3)- 异步通知 .
- 《Linux Device Drivers》第六章 高级字符驱动程序操作——note
- 第六章 高级字符驱动程序操作(一)
- linux设备驱动学习(5) 高级字符驱动程序操作--ioctl
- linux 驱动——高级字符驱动程序操作
- 高级字符驱动程序操作之异步通知IO(理论篇)
- 高级字符驱动程序操作之异步通知IO(实践篇)
- 高级字符驱动程序操作之异步通知IO(实践篇)基于内核2.6.35-30
- 有符号数和无符号数负数
- 使用Apache Shiro进行身份认证-LDAP认证
- Android控件拖动的实现
- Lucence全文索引与数据库索引
- C语言关于补码的解释及误区
- 【Linux 驱动】第六章 高级字符驱动程序操作----异步通知
- Win7“我的电脑”中无法看到摄像头
- 如何用Java进行3DES加密解密
- 指针、数组和函数
- 一季度PBC
- VisualSVN-Server 服务器端配置
- 指针函数与函数指针
- 分享三款非常实用的免费信息图
- VS2008发布WebSite ".rem 已断开连接或不在该服务器上"的解决办法