1. 什么是proc文件系统?
proc文件系统是一种虚拟文件系统,利用它可以实现linux内核空间和用户空间的通信,在用户态检查内核状态的机制。proc 文件系统中,我们可以将对虚拟文件的读写作为与内核中实体进行通信的一种手段,但是与普通文件不同的是,这些虚拟文件的内容都是动态创建的。
例如通过/proc/meminfo可以查看内存使用情况
[root@younixPC]# ls /proc
1 2040 2347 2874 474 fb mdstat sys
104 2061 2356 2930 9 filesystems meminfo sysrq-trigger
113 2073 2375 2933 acpi fs misc sysvipc
1375 21 2409 2934 buddyinfo ide modules tty
1395 2189 2445 2935 bus interrupts mounts uptime
1706 2201 2514 2938 cmdline iomem mtrr version
179 2211 2515 2947 cpuinfo ioports net vmstat
180 2223 2607 3 crypto irq partitions
181 2278 2608 3004 devices kallsyms pci
182 2291 2609 3008 diskstats kcore self
2 2301 263 3056 dma kmsg slabinfo
2015 2311 2805 394 driver loadavg stat
2019 2337 2821 4 execdomains locks swaps
配置内核信息
下面对 /proc 中的一个虚拟文件进行读写(配置),首先检查内核的 TCP/IP 栈中 IP 转发的目前设置,然后启动这种功能。
root@younixPC:/# cat /proc/sys/net/ipv4/ip_forward
0
root@younixPC:/# echo "1" > /proc/sys/net/ipv4/ip_forward
root@younixPC:/# cat /proc/sys/net/ipv4/ip_forward
1
我们还可以用 sysctl 来配置这些内核条目。
proc文件系统体现在/proc/目录下有许多功能子目录,如下所示
子目录/文件名 | 内容描述 |
---|---|
apm | 高级电源管理 |
bus | 总线以及总线上的设备 |
devices | 可用的设备信息 |
drivers | 已经启用的驱动程序 |
interrupts | 中断信息 |
ioports | 端口使用情况 |
versions | 内核版本 |
proc文件特点
1)每个文件都严格规定了严格的权限(可读、可写、那个用户有权限)
2)可以自己通过编程添加一个proc文件
3) proc文件系统存在于内存中
2.编程添加proc文件的API
内核描述
struct proc_dir_entry {
***********‘
read_proc_t read_proc,
write_proc_t write_proc,
};
创建文件
struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode, struct proc_dir_entry *parent)
name:要创建的文件名
mode: 要创建的文件属性,默认0755
parent:这个文件的父目录
创建目录
struct proc_dir_entry *proc_mkdir(const char *name,struct proc_dir_entry *parent)
name:要创建的目录名
parent:这个目录的父目录
删除目录/文件
void remove_proc_entry(const char *name, struct proc_dir_entry *parent)
name:要删除的文件/目录名
parent:这个目录的父目录
读写操作
为了能让用户读写添加的proc文件,需要挂接上读写回调函数
read_proc
write_proc
读操作回调函数原型
int read_func(char *buffer, char **stat, off_t off, int count, int *peof, void data)
buffer:把返回给用户的信息写到buffer,最大不要超过PAGE_SIZE
stat:一般不用
off: 偏移量
count: 用户要取得字节数
peof:读到文件尾时,需要把peof设为1
data: 一般不使用
写操作:
int write_func(struct file *file, const char *buffer, unsigned long count, void *data)
file:该proc文件对应的file结构
buffer:待写的数据所在的位置
count:待写的数据大小
data:一般不使用
3.编程添加proc文件实现流程
1)调用create_proc_entry创建一个struct proc_dir_entry
2) 对创建的struct proc_dir_entry进行赋值, read_proc write_proc mode owner
size等
范例