免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 708 | 回复: 0
打印 上一主题 下一主题

异步I/O [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-31 11:01 |只看该作者 |倒序浏览

               
               
  • 文件(设备)打开时默认会清除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
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP