CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Linux/Unix社区 >  内核及驱动程序研究区

问个linux驱动一书一个例子的问题

楼主xiangye(萧曳)2005-04-02 20:45:04 在 Linux/Unix社区 / 内核及驱动程序研究区 提问

linux驱动一书第二版   scull例子;先定义了一个函数指针数组  
   
  struct   file_operations   *scull_fop_array[]={  
    &scull_fops,             /*   type   0   */  
    &scull_priv_fops,   /*   type   1   */  
      &scull_pipe_fops,   /*   type   2   */  
      &scull_sngl_fops,   /*   type   3   */  
      &scull_user_fops,   /*   type   4   */  
    &scull_wusr_fops     /*   type   5   */  
  };  
   
  open函数:  
  int   scull_open(struct   inode   *inode,   struct   file   *filp)  
  {  
          Scull_Dev   *dev;   /*   device   information   */  
          int   num   =   NUM(inode->i_rdev);  
          int   type   =   TYPE(inode->i_rdev);  
          if   (!filp->private_data   &&   type)   {  
                  if   (type   >   SCULL_MAX_TYPE)   return   -ENODEV;  
                  filp->f_op   =   scull_fop_array[type];  
                  return   filp->f_op->open(inode,   filp);   /*   dispatch   to   specific   op  
  en   */  
   
          }  
   
          /*   type   0,   check   the   device   number   (unless   private_data   valid)   */  
          dev   =   (Scull_Dev   *)filp->private_data;  
          if   (!dev)   {  
                  if   (num   >=   scull_nr_devs)   return   -ENODEV;  
                  dev   =   &scull_devices[num];  
                  filp->private_data   =   dev;   /*   for   other   methods   */  
          }  
          MOD_INC_USE_COUNT;     /*   Before   we   maybe   sleep   */  
          /*   now   trim   to   0   the   length   of   the   device   if   open   was   write-only   */  
          if   (   (filp->f_flags   &   O_ACCMODE)   ==   O_WRONLY)   {  
                  if   (down_interruptible(&dev->sem))   {  
                          MOD_DEC_USE_COUNT;  
                          return   -ERESTARTSYS;  
                  }  
                  scull_trim(dev);   /*   ignore   errors   */  
                  up(&dev->sem);  
          }  
          return   0;                     /*   success   */  
  }  
   
  我的问题就是:这个open函数和函数指针数组第一项指针指向的函数处理的open函  
  数是一样的。  
   
  struct   file_operations   scull_fops   =   {  
          llseek:           scull_llseek,  
          read:               scull_read,  
          write:             scull_write,  
          ioctl:             scull_ioctl,  
          open:               scull_open,  
          release:         scull_release,  
  };  
  这样在scull_open函数中   return   filp->f_op->open(inode,   filp);时不会递归调  
  用了吗  
  问题点数:100、回复次数:3Top

1 楼xiangye(萧曳)回复于 2005-04-02 20:48:16 得分 0

在scull_open函数中   return   filp->f_op->open(inode,   filp),当filp->fop=&scull_fops时不会递归调用了吗Top

2 楼aria(*nix learner)回复于 2005-04-03 19:49:52 得分 80

注意在前面:if   (!filp->private_data   &&   type)   {  
      已经保证type不会为0,因此不会递归调用。Top

3 楼slone(slone)回复于 2005-04-03 22:15:45 得分 20

if   (!filp->private_data   &&   type)   {  
                  if   (type   >   SCULL_MAX_TYPE)   return   -ENODEV;  
                  filp->f_op   =   scull_fop_array[type];  
                  return   filp->f_op->open(inode,   filp);   /*   dispatch   to   specific   open   */  
  }  
  IF   条件说明   指定filp   设备节点与本OPEN   所在的设备节点是不一样的。  
   
  Top

相关问题

  • linux驱动安装
  • 初学linux驱动
  • 我想写一个纯软件驱动程序,有没有这方面的例子或书籍?
  • 搞ARM+Linux驱动的开发,用那两本书比较好?
  • 软猫的linux驱动?
  • LINUX磁盘驱动程序
  • linux的驱动问题
  • Linux下USB的驱动
  • Linux下USB的驱动
  • 请问有关于linux下显卡驱动方面的书或者网战吗?

关键词

  • 函数
  • scull
  • filp
  • fop
  • inode
  • enodev
  • op
  • dev
  • open
  • 不会递归调用

得分解答快速导航

  • 帖主:xiangye
  • aria
  • slone

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo