/proc 文件系统
在linux中有额外的机制可以为内核和内核模块将信息发送给进程 -- /proc 文件系统。 最初设计的目的是允许更方便的对进程信息进行访问(因此得名),现在它被每一个有有趣的东西报告的内核使用,例如 /proc/modules 有模块的列表 /proc/meminfo 有内存使用的统计表。
使用proc 文件系统的方法和使用设备驱动程序非常相似--创建一个 /proc 文件需要的所有信息的结构,包括任何处理函数的指针(在我们的例子中只有一个,当某人试图从 /proc 文件读时调用的那一个)。然后,init_module 在内核中登记该结构而cleanup_module 注销它。
我们使用 proc_register_dynamic(这是在 2.0 版中的情况,在 2.2 版中如果我们将节点设置为0系统将自动为我们做到) 的原因是我们不想预先决定我们的文件的节点数字,而是为防止冲突而由内核决定它。通常的文件系统存在于磁盘上而不是内存中(/proc 在内存中),在这中情况下,节点数是是指向文件的索引节点所在的磁盘位置的指针。节点包含文件的信息(例如文件的存取权限)和指向磁盘位置或文件数据可以被找到的几个位置的指针。
因为当文件被打开或关闭的时候不能得到调用,所以在这个模块中没有地方放置 mod_inc_use_count 和 mod_dec_use_count,并且,如果文件被打开随后模块被移除,我们没有办法避免后果。在下一 章我们会看到一个艰难的但更灵活的可以处理/proc文件的实现方式,它也可以让我们防止那个问题。
范例 procfs.c
/* procfs.c - create a "file" in /proc
* copyright (c) 1998-1999 by ori pomerantz
*/
/* 必要的头文件 */
/* 内核模块标准头文件 */
#include <linux kernel.h>/* 内核工作 */
#include <linux module.h>/* 明确指定是模块 */
/* 处理config_modversions */
#if config_modversions==1
#define modversions
#include <linux modversions.h>
#endif
/* 使用proc 文件系统所必要的 */
#include <linux proc_fs.h>
/* 在 2.2.3 版/usr/include/linux/version.h 中包含这个宏
* 但 2.0.35 版不包含 - 因此我在此加入这个以防需要。 */
#ifndef kernel_version
#define kernel_version(a,b,c) ((a)*65536+(b)*256+(c))
#endif
/* 将数据放入 proc 文件
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器