驱动学习 之 异步通知

来源:互联网 发布:git上的java开源项目 编辑:程序博客网 时间:2024/05/10 02:17

异步通知的应用场合

一个进在低优先级执行长的循环计算,但有需要很快的处理输入数据,如果该进程正在响应来自数据收集外设的新的观测数据,则应该在心数据可用时立即知晓并处理。————就是驱动程序主动通知应用程序,而不是应用程序查询。

写一个信号处理的应用函数的4点:

1. 注册信号处理函数

2. 谁发信号

3. 发给谁

4. 怎么发

写一个异步通知的驱动函数:

1.注册信号处理函数—— 应用程序 注册。

2.谁发 ——驱动

3。发给谁 ——应用程序告诉驱动它的PID

4.怎么发

从应用程序来看怎样通知内核启用一部通知机制

在应用程序中如下的代码段会启用 fd 文件到当前进程的异步通知机制:

signal(SIGIO,&input_handler);//input_handler信号处理函数

fcntl(STDIN_FILENO,F_SETOWN,getpid());//告诉驱动进程号

oflags=fcntl(STDIN_FILENO,F_GETFL);//

fcntl(STD_FILENO,F_SETFL,oflags | FASYNC);//在设备中设置FASYNC标志,

从内核角度来看驱动程序怎样实现异步信号

1. F_SETOWN被调用时对file->f_owner赋值,

2. 在执行F_SETFL 启用FASYNC时,调用驱动程序的fasync方法,只要file->f_flags中的FASYNC标志发生了变化,就会调用该方法,以便把这个变化通知驱动程序,使其能正确响应,

3. 当数据到达时,所有注册为异步通知的进程都会被发送一个SIGIO信号。

LINUX的这种通用方法基于struct fasync_struct 数据结构和int fasync_helper(int fd,struct file *file,int mode,struct fasync_struct **fa); 还有

void kill_fasync(struct fasync_struct **fa,int sig,int band);

当一个打开的文件的FASYNC标志碑修改时,调用fasync_helper以便从相关进程列表中增加或删除文件。在数据到达时可使用 kill_fasync通知所有相关的进程。它的参数包括要发送的信号(通常SIGIO)和带宽(band),后者几乎总是POLL_IN.

原创粉丝点击