【Linux】/proc文件系统

/proc文件系统是Linux中一个虚拟的内核信息存储区,通过shell脚本或程序访问,用于获取进程信息、系统设置等。文章详细介绍了如何动态创建/proc目录及其文件,以及访问权限和回调函数的使用。
摘要由CSDN通过智能技术生成

在这里插入图片描述

🔥博客主页:PannLZ
🎋系列专栏:《Linux系统之路》
😘欢迎关注:👍点赞🙌收藏✍️留言


/proc文件系统

为了提供更为简便的方法来访问内核信息,许多现代 UNIX 实现提供了一个**/proc 虚拟文件系统**。该文件系统驻留于/proc 目录中,包含了各种用于展示内核信息的文件,并且允许进程通过常规文件 I/O 系统调用来方便地读取,有时还可以修改这些信息。

之所以将/proc 文件系统称为虚拟,是因为其包含的文件和子目录并未存储于磁盘上,而是由内核在进程访问此类信息时动态创建而成

1.获取与进程相关的信息:/proc/ID

对于系统中每个进程,内核都提供了相应的目录,命名为/proc/PID,其中 PID 是进程的 ID。在此目录中的各种文件和子目录包含了进程的相关信息。例如,通过查看/proc/1 目录下的文件,可以获取piid为1的进程的信息

每个/proc/PID 目录中都存在一个命名为 status 的文件,提供了有关该进程的一系列信息。

在这里插入图片描述

在每个/proc/PID 目录中的部分其他文件:

文件描述(进程属性)
cmdline以\0 分隔的命令行参数
cwd指向当前工作目录的符号链接
EnvironNAME=value 键值对环境列表,以\0 分隔
exe指向正在执行文件的符号链接
fd文件目录,包含了指向由进程打开文件的符号链接
maps内存映射
mem进程虚拟内存(在 I/O 操作之前必须调用 lseek()移至有效偏移量)
mounts进程的安装点
root指向根目录的符号链接
status各种信息(比如,进程 ID、凭证、内存使用量、信号)
task为进程中的每个线程均包含一个子目录(始自 Linux 2.6)
2./proc 目录下的系统信息

/proc 目录下的各种文件和子目录提供了对系统级信息的访问。

在这里插入图片描述

节选/proc 子目录的用途:

目 录目录中文件表达的信息
/proc各种系统信息
/proc/net有关网络和套接字的状态信息
/proc/sys/fs文件系统相关设置
/proc/sys/kernel各种常规的内核设置
/proc/sys/net网络和套接字的设置
/proc/sys/vm内存管理设置
/proc/sysvipc有关 System V IPC 对象的信息
3. 访问/proc 文件

通常使用 shell 脚本来访问/proc 目录下的文件(使用诸如 Python 或者 Perl 之类的脚本语言,很容易解析大多数/proc 目录下包含有多个值的文件)。例如,使用 shell命令echo和cat就可修改和查看.proc目录文件下内容。

也可以从程序中使用常规 I/O 系统调用来访问/proc 目录下的文件。但在访问这些文件时, 有如下一些限制。

  • /proc 目录下的一些文件是只读的,即这些文件仅用于显示内核信息,但无法对其进行 修改。/proc/PID 目录下的大多数文件就属于此类型。
  • /proc 目录下的一些文件仅能由文件拥有者(或特权级进程)读取。例如,/proc/PID 目录下的所有文件都属于拥有相应进程的用户,而且即使是对文件的属主,其中的部 分文件(如:proc/PID/environ 文件)也仅仅授予了读权限。
  • 除了/proc/PID 子目录中的文件,/proc 目录的其他文件大多属于 root 用户,并且也仅 有 root 用户能够修改那些可修改的文件。

访问/proc/PID目录中的文件

**/proc/PID 目录内容变化不定。每个目录随着含有相应进程 ID 的进程创建而生,又随进程 的终止而灭。**这意味着要确定特定/proc/PID 目录的存在,就需要干净利落地处理如下可能性: 当打开此目录下的文件时,进程已经终止,并且也已经删除了相应的/proc/PID 目录。

4.动态创建/proc文件系统
4.1创建目录
struct proc_dir_entry *proc_mkdir(const char *name,  
                struct proc_dir_entry *parent);  
//当parent为null时即创建根目录
4.2创建proc文件
struct proc_dir_entry *create_proc_entry( const char *name,  mode_t mode,  
                struct proc_dir_entry *parent ); 

create_proc_entry函数用于创建一个一般的proc文件,其中

name是文件名

parent是要创建的proc文件的父目录(若parent = NULL则创建在/proc目录下)

create_proc_entry 的返回值是一个 proc_dir_entry 指针(或者为 NULL,说明在 create 时发生了错误)可以使用这个返回的指针来配置这个虚拟文件的其他参数,例如在对该文件执行读操作时应该调用的函数:

struct proc_dir_entry {  
    ......  
    const struct file_operations *proc_fops;    //文件操作结构体  
    struct proc_dir_entry *next, *parent, *subdir;  
    void *data;  
    read_proc_t *read_proc;                    //读回调  
    write_proc_t *write_proc;                  //写回调  
    ......  
}; 
4.3删除proc文件/目录:
void remove_dir_entry(const char *name, struct proc_dir_entry *parent);  
4.4proc文件读回调函数
static int (*proc_read)(char *page, char **start, off_t off, int count, int *eof, void *data)
4.5proc文件写回调函数
static int proc_write_foobar(struct file *file, const char *buffer, unsigned long count, void *data);
参考资料:

《Linux-UNIX系统编程手册(上、下)》

Linux内核通信之—proc文件系统(详解) - 知乎 (zhihu.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值