一、proc文件系统简介
1.是个虚拟文件系统
虚拟在:
- 无物理介质:保存系统当前工作的特殊数据,但不存在于任何物理设备中
- 数据是映射:对其进行读写时,才根据系统中的相关信息即时生成;或映
射到系统中的变量或数据结构
既然是文件系统,那么它就有一样的性质:
- 挂接目录点:
/proc
- 其内文件仍可以像一般文件:
cat
查看,echo
输入 - 但其内的文件不可以像一般文件增删,比如
mkdir
,rm
等命令都不行。得用规定的函数搞定。
2.作用
/proc
的文件可以用于访问有关内核的状态、计算机的属性、正在运行的进程的状态等信息
含义:
- 蓝色的数字文件夹:那是当前运行的进程号对应的
下面是一些重要的文件:
/proc/cpuinfo
:CPU 的信息 (型号, 家族, 缓存大小等)/proc/meminfo
:物理内存、交换空间等的信息/proc/mounts
:已加载的文件系统的列表/proc/devices
:可用设备的列表/proc/filesystems
:被支持的文件系统/proc/modules
:已加载的模块/proc/version
:内核版本/proc/cmdline
:系统启动时输入的内核命令行参数
3.函数接口
- 文件结点:
struct proc_dir_entry
- 创建目录函数
proc_mkdir()
、proc_mkdir_data()
- 创建符号链接函数
proc_symlink()
- 创建proc文件函数
proc_create()
、proc_create_data()
- 删除proc节点(文件目录都能删)函数
remove_proc_entry()
(1)结点
proc文件之所以不能用一般的文件操作搞,是因为它有着特殊的结点(目录或文件),这些文件结点构成proc文件系统。
struct proc_dir_entry
是proc文件系统的重要结构体,定义在fs/proc/internal.h
中。
- name: 节点的名称,也就是该proc文件的名称
- mode: 文件的类型和权限
- nlink: 该文件的链接数
- proc_fops: 读写操作函数
- parent: 创建节点的父目录
- 更多见:https://wenku.baidu.com/view/f76d93200722192e4536f687.html
(2)创建目录函数
struct proc_dir_entry *proc_mkdir(
const char *name,
struct proc_dir_entry *parent
)
- name:要创建的目录名称
- parent:父目录,如果为NULL,表示直接在/proc下面创建目录
struct proc_dir_entry *proc_mkdir_data(
const char *name,
umode_t mode,
struct proc_dir_entry *parent,
void *data
)
- name:要创建的目录名称
- mode:指定要创建目录的权限
- parent: 父目录,如果为NULL,表示直接在/proc下面创建目录
- data:保存私有数据的指针。
NULL
(不需要);PDE_DATA
(获取proc_mkdir_data传入的私有数据)。
PS:proc_mkdir和proc_mkdir_data的区别在于他不能保存私有数据指针。
(3)创建符号链接函数
struct proc_dir_entry *proc_symlink(
const char *name,
struct proc_dir_entry *parent,
const char *dest
)
作用:该函数在parent目录下创建一个名字为name的符号链接文件,链接的目标是dest。
参数:
- name:要创建的符号链接名称
- parent:要创建的符号链接文件所在的父目录,如果为NULL表示直接在/proc下面创建
- dest:所要创建的符号链接指向的文件名。
PS:该函数在用户空间等效为ln -s dest name
(4)创建proc文件函数
struct proc_dir_entry *proc_create(
const char *name,
umode_t mode,
struct proc_dir_entry *parent,
const struct file_operations *proc_fops
)
参数:
- name:要创建的文件名称
- mode:指定要创建文件的权限
- parent: 父目录,如果为NULL表示直接在/proc下面创建
- proc_fops: proc文件相关的操作函数
struct proc_dir_entry *proc_create_data(
const char *name,
umode_t mode,
struct proc_dir_entry *parent,
const struct file_operations *proc_fops,
void *data
)
参数:
- name:要创建的目录名称
- mode:指定要创建目录的权限
- parent:父目录,如果为NULL表示直接在/proc下面创建
- proc_fops:proc文件相关的操作函数
- data:保存私有数据的指针,如不需要则设为NULL。
PS:proc_create和proc_create_data的区 别在于他不能保存私有数据指针。
(5)删除proc节点函数
void remove_proc_entry (
const char *name,
struct proc_dir_entry *parent
)
作用:该函数将删除一个proc节点,文件和目录都能删。
参数:
- name:要删除的文件或者目录名。
- parent:符号所在的目录,如果为NULL,表示在/proc目录下