• 创建你的 /proc 文件


    一旦你有一个定义好的 read_proc 函数, 你应当连接它到 /proc 层次中的一个入口项. 使用一个 creat_proc_read_entry 调用:

    struct proc_dir_entry *create_proc_read_entry(const char *name,mode_t mode, struct proc_dir_entry *base, read_proc_t *read_proc, void *data);

    这里, name 是要创建的文件名子, mod 是文件的保护掩码(缺省系统范围时可以作为 0 传递), base 指出要创建的文件的目录( 如果 base 是 NULL, 文件在 /proc 根下创建 ), read_proc 是实现文件的 read_proc 函数, data 被内核忽略( 但是传递给 read_proc). 这就是 scull 使用的调用, 来使它的 /proc 函数可用做 /proc/scullmem:

    68

    create_proc_read_entry("scullmem", 0 /* default mode */,

    NULL /* parent dir */, scull_read_procmem, NULL /* client data */);

    这里, 我们创建了一个名为 scullmem 的文件, 直接在 /proc 下, 带有缺省的, 全局可 读的保护.

    目录入口指针可用来在 /proc 下创建整个目录层次. 但是, 注意, 一个入口放在 /proc 的子目录下会更容易, 通过简单地给出目录名子作为这个入口名子的一部分 -- 只要这个 目录自身已经存在. 例如, 一个(常常被忽略)传统的是 /proc 中与设备驱动相连的入口 应当在 driver/ 子目录下; scull 能够安放它的入口在那里, 简单地通过指定它为名子 driver/scullmem.

    /proc 中的入口, 当然, 应当在模块卸载后去除. remove_proc_entry 是恢复 create_proc_read_entry 所做的事情的函数:

    remove_proc_entry("scullmem", NULL /* parent dir */);

    去除入口失败会导致在不希望的时间调用, 或者, 如果你的模块已被卸载, 内核崩掉.

    当如展示的使用 /proc 文件, 你必须记住几个实现的麻烦事 -- 不要奇怪现在不鼓励使 用它.

    最重要的问题是关于去除 /proc 入口. 这样的去除很可能在文件使用时发生, 因为没有 所有者关联到 /proc 入口, 因此使用它们不会作用到模块的引用计数. 这个问题可以简 单的触发, 例如通过运行 sleep 100 < /proc/myfile, 刚好在去除模块之前.

    另外一个问题时关于用同样的名子注册两个入口. 内核信任驱动, 不会检查名子是否已经 注册了, 因此如果你不小心, 你可能会使用同样的名子注册两个或多个入口. 这是一个已 知发生在教室中的问题, 这样的入口是不能区分的, 不但在你存取它们时, 而且在你调用 remove_proc_entry 时.

  • 相关阅读:
    常见的问题系列【什么是子网掩码?】
    K8s系列【KubeSphere多租户账号创建流程】
    K8s系列【卸载K8s】
    K8s系列【Linux多节点部署KubeSphere】
    K8s系列【KubeSphere部署完mysql8.0再部署mysql5.0导致mysql5.0启动失败的问题】
    K8s系列【安装nfs文件系统(为k8s提供动态创建pv的能力)】
    K8s系列【Linux单节点部署KubeSphere】
    K8s系列【资源不足:0/3 nodes are available: 1 Insufficient cpu, 2 node(s) had taint {noderole.kubernetes.io/master: }, that the pod didn't tolerate】
    K8s系列【KubeSphere部署Mysql】
    idea格式化快捷键无效
  • 原文地址:https://www.cnblogs.com/fanweisheng/p/11106370.html
Copyright © 2020-2023  润新知