异步I/O
时间:2006-05-31 来源:chouqiu
- 文件(设备)打开时默认会清除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函数做下清理;
{
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);
相关阅读 更多 +