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

异步通知: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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容