- 论坛徽章:
- 0
|
文件(设备)打开时默认会清除FASYNC标志, 当用户通过fcntl函数的F_SETFL指令设置了FASYNC标志后, 设备驱动的fasync函数就会被调用;当一个文件(设备)数据到达后, 系统会向所有注册了该文件(设备)异步I/O的进程发送SIGIO信号. 而当一个进程向多个文件(设备)注册了异步I/O时, 在收到SIGIO信号后还要通过poll或select判断是哪个文件(设备)有数据;异步I/O通常只对socket和tty有效;驱动中的fasync函数借助系统提供的struct fasync_struct结构和fasync_helper, kill_fasync来完成异步I/O的功能. 在驱动的release函数中还要调用fasync函数做下清理; static int scull_fasync(int fd, struct file *filp, int mode)
{
struct scull_dev *dev = filp->private_data;
return fasync_helper(fd, filp, mode, &dev->async_queue);
}
in write():
if(dev->async_queue)
kill_fasync(&dev->async_queue, SIGIO, POLL_IN);
or in read():
if(dev->async_queue)
kill_fasync(&dev->async_queue, SIGIO, POLL_OUT);
in release():
scull_p_fasync(-1, filp, 0);
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/12072/showart_120806.html |
|