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