Linux设备驱动编程之异步通知
来源:互联网 发布:网络社交的利与弊作文 编辑:程序博客网 时间:2024/05/17 07:40
结合阻塞与非阻塞访问、poll函数可以较好地解决设备的读写,但是如果有了异步通知就更方便了。异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上"中断"地概念,比较准确的称谓是"信号驱动(SIGIO)的异步I/O"。
我们先来看一个使用信号驱动的例子,它通过signal(SIGIO, input_handler)对STDIN_FILENO启动信号机制,输入可获得时input_handler被调用,其源代码如下:
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#define MAX_LEN 100
void input_handler(int num)
{
char data[MAX_LEN];
int len;
//读取并输出STDIN_FILENO上的输入
len = read(STDIN_FILENO, &data, MAX_LEN);
data[len] = 0;
printf("input available:%s/n", data);
}
main()
{
int oflags;
//启动信号驱动机制
signal(SIGIO, input_handler);
fcntl(STDIN_FILENO, F_SETOWN, getpid());
oflags = fcntl(STDIN_FILENO, F_GETFL);
fcntl(STDIN_FILENO, F_SETFL, oflags | FASYNC);
//最后进入一个死循环,程序什么都不干了,只有信号能激发input_handler的运行
//如果程序中没有这个死循环,会立即执行完毕
while (1);
}
程序的运行效果如下图:
为了使设备支持该机制,我们需要在驱动程序中实现fasync()函数,并在write()函数中当数据被写入时,调用kill_fasync()函数激发一个信号,此部分工作留给读者来完成。
我们先来看一个使用信号驱动的例子,它通过signal(SIGIO, input_handler)对STDIN_FILENO启动信号机制,输入可获得时input_handler被调用,其源代码如下:
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#define MAX_LEN 100
void input_handler(int num)
{
char data[MAX_LEN];
int len;
//读取并输出STDIN_FILENO上的输入
len = read(STDIN_FILENO, &data, MAX_LEN);
data[len] = 0;
printf("input available:%s/n", data);
}
main()
{
int oflags;
//启动信号驱动机制
signal(SIGIO, input_handler);
fcntl(STDIN_FILENO, F_SETOWN, getpid());
oflags = fcntl(STDIN_FILENO, F_GETFL);
fcntl(STDIN_FILENO, F_SETFL, oflags | FASYNC);
//最后进入一个死循环,程序什么都不干了,只有信号能激发input_handler的运行
//如果程序中没有这个死循环,会立即执行完毕
while (1);
}
程序的运行效果如下图:
为了使设备支持该机制,我们需要在驱动程序中实现fasync()函数,并在write()函数中当数据被写入时,调用kill_fasync()函数激发一个信号,此部分工作留给读者来完成。
- Linux设备驱动编程之异步通知
- 读 《Linux设备驱动编程之异步通知》 笔记
- Linux 设备驱动学习之 异步通知
- Linux字符设备驱动之异步通知
- linux字符设备驱动之异步通知
- linux设备驱动之异步通知
- Linux设备驱动之异步通知
- Linux字符设备驱动之异步通知
- linux设备驱动之异步通知与异步I/O
- linux设备驱动--异步通知
- linux设备驱动异步通知
- linux设备驱动开发学习之旅--异步通知
- Linux设备驱动之六----异步通知的驱动程序
- Linux设备驱动之阻塞I/O与异步通知
- 驱动编程之异步通知
- 设备驱动中异步通知编程
- 深入浅出Linux设备驱动编程--设备驱动中的异步通知
- linux 驱动之异步通知
- SQL Server 存储过程的分页
- Linux设备驱动编程之阻塞与非阻塞
- VS2005中GridView的自定义分页,单选、多选的简单应用
- Redhat AS3上编译qt4.3.2,出现krb5.h找不到的问题
- 进制转换问题
- Linux设备驱动编程之异步通知
- boiz的TSQL备忘录(一)--LIKE子句和通配符
- sql多列合并的一个新方法
- 判断进程自动启动的脚本(error)
- 亲密接触Discuz!NT之架构篇:优良架构 方便网站整合与二次开发
- hibernate problems
- SQL Server中易混淆的数据类型
- bmp图片格式
- JS 去空格函数