`
tcspecial
  • 浏览: 895532 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

/proc 虚拟文件系统

阅读更多

    Linux下有一个神奇的目录/proc,经常会运行 cat /proc/cpuinfo 命令查看cpu信息,/proc下的确有cpuinfo文件,但是这个文件不是物理存在的,是软件虚拟出来的,与普通文件不同,该文件是动态的。通过/proc可以实现用户态与内核态之间的通信。在内核模式下,可以很方便的创建/proc子目录,并进行读写操作,只不过此时你需要实现文件读写接口,因为内核不知道如何处理该文件。

   下面创建/proc/test目录,并新建log文件,进行读写操作。

 

一.系统API

extern struct proc_dir_entry proc_mkdir(const char *dir_name,struct proc_dir_entry *parent);

新建/proc子目录,如parent为NULL,则在/proc根下建立目录

extern struct proc_dir_entry proc_create_entry(const char *name,mode_t mode,struct proc_dir_entry *parent);

在/proc下新建虚拟文件

extern void *remove_proc_entry(const char *name,struct proc_dir_entry *parent);

删除新建的文件或目录 

 

二.编码

#ifndef __KERNEL__
#define __KERNEL__
#endif 	/* __KERNEL__ */

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/netdevice.h>
#include <linux/proc_fs.h>
#include <linux/inet.h>
#include <linux/vmalloc.h>

#define MAX_COOKIE_LENGTH PAGE_SIZE

static struct proc_dir_entry *test_proc_dir;
static struct proc_dir_entry *log_proc_dir;
static char *cookie_pot;	 // 内核缓冲区,用于写数据
static int tValue = 12;		 // 显示值

// 读取日志文件函数
int ProcLogRead( char *buffer,
						char **start,
						off_t offset,
						int length,
						int *eof,
						void *data )
{
	int len;
	if( offset > 0 )
	{
		*eof = 1;
		return 0;
	}

	len = sprintf(buffer, "number:%x\n",tValue);
	return len;
}


// 写日志文件函数
int ProcLogWrite( struct file *filp,
							const char __user *buff,
							unsigned long len,
							void *data)
{
	if( copy_from_user( cookie_pot,buff,len ) )  // 拷贝用户空间值至内核缓冲区
	{
		return -EFAULT;
	}
	
	sscanf(cookie_pot,"%d",&tValue);   	// 保存至全局变量tValue
	printk(KERN_ALERT "%s len:%lu vl:%d\n",cookie_pot,len,tValue);
	return len;
}


static int __init testproc_init(void)
{
	int ret = 0;

	printk(KERN_ALERT "proc test init\n");

	cookie_pot = (char*)vmalloc( MAX_COOKIE_LENGTH );	// 为内核缓冲区分配空间
	if(!cookie_pot)
	{
		ret = -ENOMEM;
	}
	else
	{
		memset(cookie_pot,0,MAX_COOKIE_LENGTH);

		test_proc_dir = proc_mkdir("test",init_net.proc_net); 		// 新建/proc/net/test目录,注:2.6.32以上内核,用init_net.proc_net取代先前的pro_net
		log_proc_dir = create_proc_entry("log",0644,test_proc_dir); 	// 新建文件 /proc/net/test/log

		if(test_proc_dir == NULL
			|| log_proc_dir == NULL)
		{
			ret = -ENOMEM;
			vfree(cookie_pot);
		}
		else
		{
			// 注册读写函数
			log_proc_dir->read_proc = ProcLogRead;
			log_proc_dir->write_proc = ProcLogWrite;
		}
	}

	return 0;
}


static void __exit testproc_exit(void)
{
	printk(KERN_ALERT "clean test proc\n");

	remove_proc_entry("log",test_proc_dir);		// 删除log文件
	remove_proc_entry("test",init_net.proc_net);	// 删除test目录

	vfree(cookie_pot);
}

module_init(testproc_init);
module_exit(testproc_exit);

MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("kettas");
MODULE_DESCRIPTION("proc test");
MODULE_VERSION("1.0.0");
MODULE_ALIAS("Proc 01");

 

三.编译运行

 

[scada@linux proc_test]$ sudo insmod proc_test.ko
[scada@linux proc_test]$ ll /proc/net/test/
总用量 0
-rw-r--r--. 1 root root 0 1月  11 22:14 log
[scada@linux proc_test]$ cat /proc/net/test/log 
number:c

 

 

四.接口操作

    上面用cat命令直接查看log文件,既然内核提供了通用的read(),write()文件访问接口,那试试。

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <assert.h>
#include <string.h>

int main(int argc,char **argv)
{
	int fd = open("/proc/net/test/log",O_RDWR,0);
	assert(fd != -1);

	char *vl = "10";  // 此处为字符串 

	// write
	int ret = write(fd,vl,strlen(vl));
	printf("ret:%d\n",ret);

	// read
	char buff[100] = {};
	ret = read(fd,buff,100);
	assert(ret != -1);

	printf("read:%s\n",buff);
	close(fd);

	return 0;
}

 

运行:

[scada@linux proc_test]$ sudo ./write_test
ret:2
read:number:a

   向/proc/net/test/log写入10后,显示了16进制结果a,测试OK

 

 

分享到:
评论

相关推荐

    使用 /proc 文件系统来访问 Linux 内核的内容.rar

    /proc 文件系统是一个虚拟文件系统,通过它可以使用一种新的方法在 Linux® 内核空间和用户空间之间进行通信。在 /proc 文件系统中,我们可以将对虚拟文件的读写作为与内核中实体进行通信的一种手段,但是与普通文件...

    Qt实现的基于/proc的Linux资源管理器

    基于Ubuntu下/proc虚拟文件系统实现的类似Windows的资源管理器,文章介绍:https://blog.csdn.net/z18223345669/article/details/122377005;内含项目文件和设计报告

    linux驱动开发proc文件初步

    proc文件系统讲解,非常详细。 1 收集系统信息 1.0 proc文件系统概览 1.1 进程相关信息子目录 1.2 内核数据 1.3 IDE接口信息 /proc/ide 1.4 网络统计信息 /proc/net 1.5 SCSI接口信息 /proc/scsi 1.6 并行端口信息 /...

    Linux服务器监测命令及CPU、硬盘、内存状态命令

    这是通过 /proc 虚拟文件系统实现的。/proc 文件虚拟系统是一种 内核和内核模块用来向进程 (process) 发送信息的机制 (所以叫做 /proc)。这个伪文件 系统让你可以和内核内部数据结构进行交互,获取 有关进程的有用...

    C++基于proc虚拟文件系统的Linux下资源管理器源码+课程设计报告(课程设计).zip

    C++基于proc虚拟文件系统的Linux下资源管理器源码+课程设计报告(课程设计).zip 【资源介绍】 内含操作系统课程设计报告+源码 内含操作系统课程设计报告+源码 C++基于proc虚拟文件系统的Linux下资源管理器源码+课程...

    虚拟化平台\LINUX 查看MAC

    dmesg | tail 该命令会输出系统日志的最后10行 cat /proc/cpuinfo //显示CPU info的信息 cat /proc/interrupts // 显示中断 ...cat /proc/mounts //显示已加载的文件系统 clock -w //将时间修改保存到 BIOS

    Python实现Linux监控的方法

    Linux 系统为管理员提供了非常好的方法,使其可以在系统运行时更改内核,而不需要重新引导内核系统,这是通过/proc 虚拟文件系统实现的。/proc 文件虚拟系统是一种内核和内核模块用来向进程(process)发送信息的...

    Linux下Proc文件系统的应用

    这是在Linux操作系统的Proc虚拟文件系统下建立文件并管理文件的内容,是我们的一个课程设计。我们建立了三个文件用于饭店系统管理。一个是菜单,一个是会员还有一个根目录。本程序适用于初学者学习proc文件系统。

    基于虚拟文件系统proc的财富分发程序

    基于虚拟文件系统proc的财富分发程序基于虚拟文件系统proc的财富分发程序基于虚拟文件系统proc的财富分发程序基于虚拟文件系统proc的财富分发程序基于虚拟文件系统proc的财富分发程序基于虚拟文件系统proc的财富分发...

    Sysinfo 是一个提供 Linux 操作系统/内核/硬件系统信息的 Go 库_GO_代码_相关文件_下载

    访问 /sys & /proc Linux 虚拟文件系统 访问 /etc、/var、/run FS 层次结构中的各种文件 超级用户权限(访问 SMBIOS/DMI 表并检测 RAM 大小和属性) Sysinfo 不需要目标系统上的任何其他外部实用程序,这是它的主要...

    实验七Linux文件系统编程技术

    Linux上的/proc目录是一种文件系统,称为proc文件系统(虚拟文件系统),它存储内核状态信息,包括cpu、内存以及进程等信息。proc文件系统有很多优点:应用程序获取内核数据不用切换到内核态,增加了系统的安全性...

    proc文件系统的实现

    实验要求: 掌握虚拟文件系统的实现原理 实践文件、目录、索引节点等概念 操作系统的一个实验题目

    Linux 系统精解

    /proc 虚拟的目录。保存当前操作系统在内存中的镜像。 /root root的家目录。 /sbin 保存root用户使用的命令。 /tmp 保存临时文件。 /usr 保存不经常变动的数据及第三方程序。 /var 保存一些经常改变的数据。

    linux文件系统基础知识

    PROC : 虚拟的进程文件系统 ISO9660 : 大部分光盘所采用的文件系统 ufsSun : OS 所采用的文件系统 NCPFS : Novell 服务器所采用的文件系统 SMBFS : Samba 的共享文件系统 XFS : 由SGI开发的先进的日志文件...

    操作系统实验报告,观察Linux的行为、SHELL编程

    proc文件系统将进程的地址空间、系统的硬件信息、系统相关机制(中断、I/O)等内容全部设置为虚拟的Linux文件,为访问系统内核数据的操作提供接口。 (1) 以root登录系统,并进入/proc目录,键入ls命令,查看/proc下...

    rtop:终端的系统监控仪表板

    Rtop 一个简单的系统监视仪表板脚本,用于通过/Proc虚拟文件系统使用Linux系统变量的Shell。 我做了一个初学者项目,目的是从top和获得有关Ruby的经验。 这个项目还没有完成,我计划将其完成并在ruby和CLI工具上获得...

    Proc_Toolkit:用于收集,解析和处理procfs虚拟文件系统的信息的工具包

    用于解析/ proc以获得系统信息的工具包 注意:该工具仍处于早期阶段,缺少一些功能或功能不完全的组件,这些组件将在以后的推送中添加。 目的 该工具包的最初目的是创建接近bash的核心功能脚本,以解析/proc中的数据...

    logstash-input-proc:一个Logstash插件来读取Linux内核proc挂载

    Logstash输入Pro解析器##这是的插件。 该插件用于读取/ proc虚拟文件系统,并对其中的文件进行解码。 我正在使用以下页面作为参考文献资料

    Linux内核中的proc文件系统

    它是一个虚拟文件系统: 它不是实际的存储设备中的文件,而是存在于内存中。procfs中的文件是用来允许用户空间的程序访问内核中的某些信息(比如进程信息在 /proc/[0-9]+/ 中),或者用来做调试用途( /proc/ksyms ,...

    rhce系统管理ppt教程

    文件系统管理 文件结构 文件系统 ext2/ext3文件系统 ReiserFS文件系统 一个非常优秀的文件系统 可轻松管理上百G的文件系统 先进的日志机制 高效的磁盘空间利用 独特的搜寻方式 文件属性 ext3文件系统 其他常见...

Global site tag (gtag.js) - Google Analytics