167 lines
6.0 KiB
Markdown
167 lines
6.0 KiB
Markdown
|
# 进程文件系统 (procfs)
|
||
|
|
||
|
## 数据结构
|
||
|
|
||
|
```c
|
||
|
struct proc_dentry
|
||
|
{
|
||
|
rt_uint32_t mode;
|
||
|
rt_atomic_t ref_count;
|
||
|
|
||
|
struct proc_dentry *parent;
|
||
|
struct dfs_vfs_node node;
|
||
|
|
||
|
const struct dfs_file_ops *fops;
|
||
|
const struct proc_ops *ops;
|
||
|
|
||
|
char *name;
|
||
|
void *data;
|
||
|
};
|
||
|
```
|
||
|
|
||
|
```log
|
||
|
root { mode: S_IFDIR, ref_count: 1, parent: root, name: /, child->next: file1->node }
|
||
|
|
|
||
|
|—— file1 { mode: S_IFREG, ref_count: 1, parent: root, name: file1, node->next: link1->node }
|
||
|
|—— link1 { mode: S_IFLNK, ref_count: 1, parent: root, name: link1, data: fullpath, node->next: dir1->node }
|
||
|
|—— dir1 { mode: S_IFDIR, ref_count: 1, parent: root, name: dir1, node->next: file3->node, child->next: file2->node }
|
||
|
| |
|
||
|
| |—— dir2 { mode: S_IFDIR, ref_count: 1, parent: dir1, name: dir2, node->next: link2->node }
|
||
|
| |—— link2 { mode: S_IFLNK, ref_count: 1, parent: dir1, name: link2, data: fullpath, node->next: file2->node }
|
||
|
| |—— file2 { mode: S_IFREG, ref_count: 1, parent: dir1, name: file2 }
|
||
|
|
|
||
|
|—— file3 { mode: S_IFREG, ref_count: 1, parent: root, name: file3 }
|
||
|
```
|
||
|
|
||
|
## API 介绍
|
||
|
|
||
|
```c
|
||
|
struct proc_dentry *dfs_proc_find(const char *name);
|
||
|
|
||
|
struct proc_dentry *proc_mkdir_data(const char *name, mode_t mode, struct proc_dentry *parent,
|
||
|
const struct dfs_file_ops *fops, void *data);
|
||
|
struct proc_dentry *proc_mkdir_mode(const char *name, mode_t mode, struct proc_dentry *parent);
|
||
|
struct proc_dentry *proc_mkdir(const char *name, struct proc_dentry *parent);
|
||
|
|
||
|
struct proc_dentry *proc_create_data(const char *name, mode_t mode, struct proc_dentry *parent,
|
||
|
const struct dfs_file_ops *fops, void *data);
|
||
|
|
||
|
struct proc_dentry *proc_symlink(const char *name, struct proc_dentry *parent, const char *dest);
|
||
|
|
||
|
struct proc_dentry *proc_acquire(struct proc_dentry *dentry);
|
||
|
void proc_release(struct proc_dentry *dentry);
|
||
|
|
||
|
void proc_remove(struct proc_dentry *dentry);
|
||
|
```
|
||
|
|
||
|
- dfs_proc_find
|
||
|
|
||
|
查找指定节点,并返回节点数据指针
|
||
|
|
||
|
| 入参 | 说明 |
|
||
|
| ---- | ---------------------------------------------------- |
|
||
|
| name | 从 procfs 的 root 起始的完整路径,比如 “/dir1/file2” |
|
||
|
|
||
|
- proc_mkdir_data
|
||
|
|
||
|
创建一个目录,并返回节点数据指针
|
||
|
|
||
|
| 入参 | 说明 |
|
||
|
| ------ | ------------------------------------------------------------ |
|
||
|
| name | 从 procfs 的 root 起始的完整路径,比如 “/dir1/file2”<br />从 parent 起始的完整路径 |
|
||
|
| mode | 权限配置 |
|
||
|
| parent | 指定创建目录的起始节点 |
|
||
|
| fops | 文件操作接口配置 |
|
||
|
| data | 私有数据 |
|
||
|
|
||
|
- proc_mkdir_mode
|
||
|
|
||
|
创建一个目录,并返回节点数据指针
|
||
|
|
||
|
| 入参 | 说明 |
|
||
|
| ------ | ------------------------------------------------------------ |
|
||
|
| name | 从 procfs 的 root 起始的完整路径,比如 “/dir1/file2”<br />从 parent 起始的完整路径 |
|
||
|
| mode | 权限配置 |
|
||
|
| parent | 指定创建目录的起始节点 |
|
||
|
|
||
|
- proc_mkdir
|
||
|
|
||
|
创建一个目录,并返回节点数据指针
|
||
|
|
||
|
| 入参 | 说明 |
|
||
|
| ---- | ------------------------------------------------------------ |
|
||
|
| name | 从 procfs 的 root 起始的完整路径,比如 “/dir1/file2”<br />从 parent 起始的完整路径 |
|
||
|
| mode | 权限配置 |
|
||
|
|
||
|
- proc_create_data
|
||
|
|
||
|
创建一个文件,并返回节点数据指针
|
||
|
|
||
|
| 入参 | 说明 |
|
||
|
| ------ | ------------------------------------------------------------ |
|
||
|
| name | 从 procfs 的 root 起始的完整路径,比如 “/dir1/file2”<br />从 parent 起始的完整路径 |
|
||
|
| mode | 权限配置 |
|
||
|
| parent | 指定创建文件的起始节点 |
|
||
|
| fops | 文件操作接口配置 |
|
||
|
| data | 私有数据 |
|
||
|
|
||
|
- proc_symlink
|
||
|
|
||
|
创建一个符号链接,并返回节点数据指针
|
||
|
|
||
|
| 入参 | 说明 |
|
||
|
| ------ | ------------------------------------------------------------ |
|
||
|
| name | 从 procfs 的 root 起始的完整路径,比如 “/dir1/file2”<br />从 parent 起始的完整路径 |
|
||
|
| parent | 指定创建文件的起始节点 |
|
||
|
| dest | 链接的目标文件完整路径 |
|
||
|
|
||
|
- proc_acquire
|
||
|
|
||
|
引用一个节点,并返回节点数据指针
|
||
|
|
||
|
| 入参 | 说明 |
|
||
|
| ------ | -------------- |
|
||
|
| dentry | 需要引用的节点 |
|
||
|
|
||
|
- proc_release
|
||
|
|
||
|
释放一个节点
|
||
|
|
||
|
| 入参 | 说明 |
|
||
|
| ------ | -------------- |
|
||
|
| dentry | 需要释放的节点 |
|
||
|
|
||
|
- proc_remove
|
||
|
|
||
|
删除一个节点包含子节点
|
||
|
|
||
|
| 入参 | 说明 |
|
||
|
| ------ | -------------- |
|
||
|
| dentry | 需要删除的节点 |
|
||
|
|
||
|
## msh 调试命令
|
||
|
|
||
|
- proc_dump
|
||
|
|
||
|
遍历打印指定节点含子节点的信息(名称、引用计数),比如 `proc_dump /dir1` 或者 `proc_dump`
|
||
|
|
||
|
- proc_remove
|
||
|
|
||
|
删除指定节点含子节点,比如 `proc_remove /dir1` 或者 `proc_remove /file3`
|
||
|
|
||
|
- proc_symlink
|
||
|
|
||
|
创建一个符号链接,`proc_symlink /link3 /mnt`
|
||
|
|
||
|
- proc_echo
|
||
|
|
||
|
创建一个空文件,`proc_echo /file4`
|
||
|
|
||
|
- proc_mkdir
|
||
|
|
||
|
创建一个空目录,`proc_mkdir /dir3`
|
||
|
|
||
|
- proc_pid
|
||
|
|
||
|
创建一个 pid 目录,`proc_pid /101`
|