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® 内核空间和用户空间之间进行通信。在 /proc 文件系统中,我们可以将对虚拟文件的读写作为与内核中实体进行通信的一种手段,但是与普通文件...
基于Ubuntu下/proc虚拟文件系统实现的类似Windows的资源管理器,文章介绍:https://blog.csdn.net/z18223345669/article/details/122377005;内含项目文件和设计报告
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 并行端口信息 /...
这是通过 /proc 虚拟文件系统实现的。/proc 文件虚拟系统是一种 内核和内核模块用来向进程 (process) 发送信息的机制 (所以叫做 /proc)。这个伪文件 系统让你可以和内核内部数据结构进行交互,获取 有关进程的有用...
C++基于proc虚拟文件系统的Linux下资源管理器源码+课程设计报告(课程设计).zip 【资源介绍】 内含操作系统课程设计报告+源码 内含操作系统课程设计报告+源码 C++基于proc虚拟文件系统的Linux下资源管理器源码+课程...
dmesg | tail 该命令会输出系统日志的最后10行 cat /proc/cpuinfo //显示CPU info的信息 cat /proc/interrupts // 显示中断 ...cat /proc/mounts //显示已加载的文件系统 clock -w //将时间修改保存到 BIOS
Linux 系统为管理员提供了非常好的方法,使其可以在系统运行时更改内核,而不需要重新引导内核系统,这是通过/proc 虚拟文件系统实现的。/proc 文件虚拟系统是一种内核和内核模块用来向进程(process)发送信息的...
这是在Linux操作系统的Proc虚拟文件系统下建立文件并管理文件的内容,是我们的一个课程设计。我们建立了三个文件用于饭店系统管理。一个是菜单,一个是会员还有一个根目录。本程序适用于初学者学习proc文件系统。
基于虚拟文件系统proc的财富分发程序基于虚拟文件系统proc的财富分发程序基于虚拟文件系统proc的财富分发程序基于虚拟文件系统proc的财富分发程序基于虚拟文件系统proc的财富分发程序基于虚拟文件系统proc的财富分发...
访问 /sys & /proc Linux 虚拟文件系统 访问 /etc、/var、/run FS 层次结构中的各种文件 超级用户权限(访问 SMBIOS/DMI 表并检测 RAM 大小和属性) Sysinfo 不需要目标系统上的任何其他外部实用程序,这是它的主要...
Linux上的/proc目录是一种文件系统,称为proc文件系统(虚拟文件系统),它存储内核状态信息,包括cpu、内存以及进程等信息。proc文件系统有很多优点:应用程序获取内核数据不用切换到内核态,增加了系统的安全性...
实验要求: 掌握虚拟文件系统的实现原理 实践文件、目录、索引节点等概念 操作系统的一个实验题目
/proc 虚拟的目录。保存当前操作系统在内存中的镜像。 /root root的家目录。 /sbin 保存root用户使用的命令。 /tmp 保存临时文件。 /usr 保存不经常变动的数据及第三方程序。 /var 保存一些经常改变的数据。
PROC : 虚拟的进程文件系统 ISO9660 : 大部分光盘所采用的文件系统 ufsSun : OS 所采用的文件系统 NCPFS : Novell 服务器所采用的文件系统 SMBFS : Samba 的共享文件系统 XFS : 由SGI开发的先进的日志文件...
proc文件系统将进程的地址空间、系统的硬件信息、系统相关机制(中断、I/O)等内容全部设置为虚拟的Linux文件,为访问系统内核数据的操作提供接口。 (1) 以root登录系统,并进入/proc目录,键入ls命令,查看/proc下...
Rtop 一个简单的系统监视仪表板脚本,用于通过/Proc虚拟文件系统使用Linux系统变量的Shell。 我做了一个初学者项目,目的是从top和获得有关Ruby的经验。 这个项目还没有完成,我计划将其完成并在ruby和CLI工具上获得...
用于解析/ proc以获得系统信息的工具包 注意:该工具仍处于早期阶段,缺少一些功能或功能不完全的组件,这些组件将在以后的推送中添加。 目的 该工具包的最初目的是创建接近bash的核心功能脚本,以解析/proc中的数据...
Logstash输入Pro解析器##这是的插件。 该插件用于读取/ proc虚拟文件系统,并对其中的文件进行解码。 我正在使用以下页面作为参考文献资料
它是一个虚拟文件系统: 它不是实际的存储设备中的文件,而是存在于内存中。procfs中的文件是用来允许用户空间的程序访问内核中的某些信息(比如进程信息在 /proc/[0-9]+/ 中),或者用来做调试用途( /proc/ksyms ,...
文件系统管理 文件结构 文件系统 ext2/ext3文件系统 ReiserFS文件系统 一个非常优秀的文件系统 可轻松管理上百G的文件系统 先进的日志机制 高效的磁盘空间利用 独特的搜寻方式 文件属性 ext3文件系统 其他常见...