linux 创建你的 /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 时. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |