读书笔记:LLD3 (3)异步通知

2016-04-14  本文已影响0人  rlkbk

异步通知:poll此类方法是采用轮询机制实现,有时不算一个好方法。而通过异步通知,应用程序可以在数据可用时收到一个信号,而不需要不停得使用轮询来关注数据。

异步通知的实现:

首先,它们之地给一个进程作为文件的“属主(owner)”。采用F_SETOWN命令,属主的进程ID就保存在filp->f_owner中。

设置FASYNC标志。通过F_SETFL命令实现。

实例代码(ldd3):

signal(SIGIO,&input_handler);

fcntl(STDIN_FILENO,F_SETOWN,getpid());

oflags = fcntl(STDIN_FILENO,F_GETFL);

fcntl(STDIN_FILENO,F_SETFL,oflags | FASYNC);

驱动程序要调用的两个函数的原型:

int fasync_helper(int fd, struct file *filp, int mode, struct fasync_struct **fa);

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

fasync_helper是在FASYNC标志被修改时调用,比如调用release()函数时。

kill_fasync函数是在异步通知时调用,比如当向缓存区写入数据后,通知进程读取缓存上的数据。

2016.04.15

上一篇 下一篇

猜你喜欢

热点阅读