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
相关推荐
在Linux操作系统中,/proc文件系统是一个非常重要的虚拟文件系统,它提供了查看和修改内核运行时状态的接口。这个特殊的文件系统并不占用磁盘空间,而是动态地反映了当前系统的进程、硬件信息以及各种系统参数。`/...
/proc 文件系统是一个虚拟文件系统,通过它可以使用一种新的方法在 Linux® 内核空间和用户空间之间进行通信。在 /proc 文件系统中,我们可以将对虚拟文件的读写作为与内核中实体进行通信的一种手段,但是与普通文件...
在Linux操作系统中,/proc文件系统是一个非常特殊的虚拟文件系统,它并不占用磁盘空间,而是作为内核与用户空间之间的一个接口,用于提供运行时的系统信息。这个特殊的文件系统允许用户通过读取其中的文件来获取关于...
基于Ubuntu下/proc虚拟文件系统实现的类似Windows的资源管理器,文章介绍:https://blog.csdn.net/z18223345669/article/details/122377005;内含项目文件和设计报告
在 Linux 系统中,/proc 文件系统是一个虚拟文件系统,它提供了对系统硬件和软件信息的访问。通过读取 /proc 文件系统,可以获取到系统的 CPU、内存、进程、磁盘等信息。在本实验中,我们将使用 GTK 图形库来读取 /...
在 Linux 系统中,proc_pid_statm 函数是通过 proc 文件系统来实现的,该文件系统提供了一个接口,允许用户空间程序访问内核空间的信息。proc_pid_statm 函数正是通过这个接口来获取任务虚拟地址空间的大小和应用...
在Linux操作系统中,`/proc/cpuinfo`是一个虚拟文件,它提供了系统CPU的详细信息。这个文件并不存储在硬盘上,而是由内核动态生成,每次读取时都会反映出当前系统的实时状态。通过读取`/proc/cpuinfo`,我们可以获取...
C++基于proc虚拟文件系统的Linux下资源管理器源码+课程设计报告(课程设计).zip 【资源介绍】 内含操作系统课程设计报告+源码 内含操作系统课程设计报告+源码 C++基于proc虚拟文件系统的Linux下资源管理器源码+课程...
由于/proc不是一个实际存在于硬盘上的文件系统,而是存在于内存中,因此它被称为虚拟或伪文件系统。这个系统允许用户通过读取和写入特定的文件来获取和修改内核参数。 在Linux中,/proc文件系统的主要功能是: 1. ...
在Linux系统中,`/proc`是一个虚拟文件系统,它提供了访问内核数据结构的接口。`xt_qtaguid`是iptables的一个模块,用于实现流量控制和标记,它将网络流与特定的用户ID和组ID关联起来。`stats`文件则记录了这些标记...
在Linux中,`/proc`是一个虚拟文件系统,它并不占用磁盘空间,而是动态地反映了当前系统的运行情况。下面我们将详细探讨`/proc`文件系统的一些关键知识点: 1. **系统信息获取**: - `/proc/cpuinfo`:显示CPU信息...
Proc 文件系统是 Linux 操作系统中的一种虚拟文件系统,它提供了对系统硬件和进程信息的访问接口。Proc 文件系统是 Linux 系统中一种特殊的文件系统,它不占用磁盘空间,也不需要磁盘存储,它的所有内容都是实时生成...
这个虚拟文件系统对于系统管理员和开发者来说至关重要,因为它提供了查看和交互内核运行时信息的途径。 在proc文件系统中,每个文件或目录都对应着一个特定的内核数据结构,如进程信息、硬件信息、网络状态等。下面...
在Linux系统中,`/proc` 文件系统是一个特殊的虚拟文件系统,它充当了一个连接内核空间与用户空间的桥梁。通过这一机制,用户可以方便地获取系统状态信息、监控进程活动以及调整内核参数。本文将深入探讨 `/proc` ...
`/proc`是一个虚拟文件系统,它提供了查看和修改内核状态的接口。这个特殊的文件系统并不占用磁盘空间,而是直接反映了系统当前的内存状态和进程信息。 `/proc`目录下包含了很多以数字或名字命名的子目录,这些代表...
该文件介绍了一个基于Linux Shell的安全审计机制,该机制通过使用可装入内核模块、/proc虚拟文件系统和系统调用劫持技术,实现了一个较全面的入侵检测审计机制。在该机制中,命令历史记录被用作审计信息的重要来源,...
Linux下的Proc文件系统是Linux内核提供的一种特殊文件系统,它并不存储在硬盘上,而是一种内存映射的虚拟文件系统,主要用于提供内核状态和进程信息。Proc被挂载在根目录`/proc`下,它使得用户可以通过读取和写入...
/proc文件系统是Linux提供的一种特殊虚拟文件系统,它并不实际存在于磁盘上,而是由内核动态生成并维护,用于向用户空间提供关于系统状态和内核内部信息的接口。 文章指出,在进行Linux内核嵌入式开发时,开发者...