当前位置:  技术问答>linux和unix

linux设备驱动中的信号量机制

    来源: 互联网  发布时间:2016-03-24

    本文导语:  《linux设备驱动程序》3rd 简称ldd3,在第三章高级字符设备驱动中介绍了信号量机制后,我查看了ldd3附带的源代码,对其中某些部分不理解,请教各位:        在scull.h中定义结构的,如下     /*       struct ...

《linux设备驱动程序》3rd 简称ldd3,在第三章高级字符设备驱动中介绍了信号量机制后,我查看了ldd3附带的源代码,对其中某些部分不理解,请教各位:   
    在scull.h中定义结构的,如下
    /*
      struct scull_dev {
struct scull_qset *data;  /* Pointer to first quantum set */
int quantum;              /* the current quantum size */
int qset;                /* the current array size */
unsigned long size;      /* amount of data stored here */
unsigned int access_key;  /* used by sculluid and scullpriv */
struct semaphore sem;    /* mutual exclusion semaphore    */  这里定义的结构中包含了信号量
struct cdev cdev;   /* Char device structure */
      };

    在main.c中定义了全局变量
    struct scull_dev *scull_devices; /* allocated in scull_init_module */

    /*
    在初始化函数scull_init_module里面初始化信号量:scull_devices->sem;

    但是在sucll_open函数里面,又重新定义了一个scull_dev指针:
    struct scull_dev *dev; /* device information */
    并有以下语句:
      dev = container_of(inode->i_cdev, struct scull_dev, cdev);
filp->private_data = dev; /* for other methods */
    还检测信号量:
    if (down_interruptible(&dev->sem))
return -ERESTARTSYS;
 
    问:
      1.在初始化函数scull_init_module里面初始化的信号量和在打开函数:scull_open里面检测的信号量是不是同一个?如果不是,又为什么在
        scull_init_module里面初始化不是属于scull_open里的需要检测的信号量?
          

|
是的。


我觉得你看书不是很仔细,理解的关键点在于container_of

其实在LDD3里也有说到:
3.5 open and release

...

int (*open)(struct inode *inode, struct file *filp);


The inode argument has the information we need in the form of its i_cdev field, which contains the cdev structure we set up before. The only problem is that we do not normally want the cdev structure itself, we want the scull_dev structure that contains that cdev structure. The C language lets programmers play all sorts of tricks to make that kind of conversion; programming such tricks is error prone, however, and leads to code that is difficult for others to read and understand. Fortunately, in this case, the kernel hackers have done the tricky stuff for us, in the form of the container_of macro, defined in :

container_of(pointer, container_type, container_field);


This macro takes a pointer to a field of type container_field, within a structure of type container_type, and returns a pointer to the containing structure. In scull_open, this macro is used to find the appropriate device structure:

struct scull_dev *dev; /* device information */



...

    
 
 

您可能感兴趣的文章:

  • 在linux下怎么使用信号量?
  • linux 中信号量的使用 当信号初始化的时候设置的值大于1将是如何?
  • 关于Linux下的信号量
  • 请问下,在嵌入式linux驱动里面可不可以用信号量?
  • linux中信号量实现原理
  • linux下信号量的释放的问题
  • linux服务器中,php页面中信号量锁住的问题,在线等
  • 在linux下有没有系统的命令可以看到某个信号量被哪个进程锁定?
  • linux posix信号量使用疑问
  • 靠,Linux提供给应用开发的信号量机制也太复杂了吧
  • 求 思路 信号量控制函数中的线程sleep 100微秒。(linux)
  • 一个关于linux的信号量集的问题
  • 求助:linux 用户态 线程同步中信号量、互斥量、锁之间的区别?
  • 关于Linux程序设计中多线程信号量的一个疑问
  • Linux内核信号量和定时器问题请教:
  • linux 下使用信号量编程的问题·~~~~谁能帮帮我啊????
  • linux多线程编程详解教程(线程通过信号量实现通信代码)
  • UIO(linux Userspace I/O子系统)用户空间设备驱动I/O技术介绍
  • Linux设备驱动(第三版)- 字符设备驱动 - 例子
  • 各位设备驱动开发的朋友,请问,linux设备驱动开发和网络编程开发哪一样工资比较高呀?
  • Linux下写了一个字符设备驱动,找不到设备文件在哪个目录
  • 请教Linux设备驱动的具体应用(基于PC)
  • linux USB从口设备驱动问题
  • 跪求linux下usb音视频设备驱动
  • 请教!linux设备驱动
  • LCD设备驱动 LCD-Linux
  • Linux设备驱动程序开发
  • linux上的USB从设备驱动!
  • 想走嵌入式linux设备驱动方向,请多指点
  • linux设备驱动开发
  • linux 设备驱动开发&调试技术---!!!!!!!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 学习linux的新手问:linux进程信号掩码以及信号阻塞与信号未决怎么理解?
  • 【求助】linux/Unix下创建子进程,向父进程发送信号,子进程也能收到改信号,此时如何让子进程不收到信号
  • Linux下的信号忽略和信号阻塞是什么意思
  • 编程语言 iis7站长之家
  • linux 信号中断
  • linux 信号 按什么键能发SIGCONT 信号??
  • linux的信号处理函数中如何访问共享资源
  • linux中 关于 进程和信号的问题
  • 如何使用命令行删除Linux下的POSIX有名信号灯
  • linux 下多线程 每个线程能否使用alarm来处理,信号是否会乱呢?
  • 关于linux内核中信号处理的问题?(信号处理的时间)
  • linux多线程信号问题
  • linux下面的信号都已经是"可靠信号"了吗,已经没有了不可靠信号?
  • linux 只有SIGUSR1和SIGUSR2,如果有多个应用程序需要信号,怎么办?
  • Linux,aix,windows下可以查询非本进程的信号处理函数吗?
  • linux 下信号机制问题
  • 请问那些linux信号是不能捕捉的?
  • linux信号处理程序
  • linux下信号的问题。。
  • linux2.4到2.6,信号的概念有哪些变化?
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • linux命令大全详细分类介绍及常用linux命令文档手册下载


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3