Linux中proc文件系统相关介绍

proc虚拟文件系统的工作原理

  • linux 内核是一个非常庞大、非常复杂的一个单独的程序,对于这样一个程序来说调试是非常复杂的。
  • 像kernel这样庞大的项目,给里面添加或者修改一个功能是非常麻烦的,因为添加一个功能可能会影响其他已经有的功能。
  • 早期内核版本中尽管调试很麻烦,但是大佬们还可以凭借自己能力来驾驭,到了2.4左右的版本,这个难度已经非常大了。为了降低内核的调试和学习的难度,这个内核开发者们在内核添加了一些属性,专门用于调试内核,proc文件系统就是一个尝试。
  • proc文件系统的思路:在内核中构建一个虚拟文件系统/proc,内核运行时将内核一些关键数据结构以文件的方式呈现在/proc目录中的一些特定文件,这样相当于不可见的内核的数据结构以可视化方式呈现给内核开发者。
  • proc文件系统给开发者一种调试内核的方法:我们通过实时观察/proc/xxxx文件,来观看内核中数据结构的值,在我们添加一个新功能的前后来对比,就可以知道这个新功能产生的影响对不对。
  • proc目录下的文件大小都是0,因为这些文件本身并不存在硬盘之中,他也不是一个真实的文件,他只是一个接口,当我们去读取这个文件的时候,其实内核并不是去硬盘找这个文件,而是映射为内核内部一个数据结构被读取并格式化为字符串返回给我们。所以尽管我们看到的还是一个文件内容的字符串,和普通文件一样,但是实际上内容实时从内核数据结构中来的。

常见proc文件介绍

  • /proc/cmdline
  • /proc/cpuinfo
    例如使用 cat 查看 /pro/cpuinfo

proc文件系统的使用

  • cat命令手动查看
    cat /proc/version 查看系统版本
  • 程序访问文件IO 来查看结果
c 复制代码
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include<stdlib.h>
#include<fcntl.h>
#include<stdio.h>
#include<string.h>
int main(int argc,char **argv){
    char buf[512];
    memset(buf,0,sizeof(buf));
    if(argc!=2){
        printf("usage: %s version|devices\n",argv[0]);
        return -1;
    }
    // strcmp 如果相等 返回值为 0
    if(!strcmp(argv[1],"-v")){
        // 读取proc/vesion;
        int fd  = open("/proc/version",O_RDONLY);
        if(fd < 0){
            perror("open /proc/version");
        }
        read(fd,buf,sizeof(buf));
        printf("结果是 %s",buf);
    }else if(!strcmp(argv[1],"-d")){
        //读取 proc/devices;
        int fd  = open("/proc/devices",O_RDONLY);
        if(fd < 0){
            perror("open /proc/devices");
        }
        read(fd,buf,sizeof(buf));
        printf("结果是 %s",buf);
    }
    return 0;
}

效果如图:

  • sys文件系统
    1.sys文件系统本质上和proc文件系统是一样的,都是虚拟文件系统,都在根目录下有一个目录 (一个是/proc 一个是 /sys),因此都不是硬盘中的文件,都是内核中的数据结构的可视化接口。
    2.不同的是/proc中的文件只能读,但是/sys中的文件可以读写,读/sys中的文件就是获取内核中的数据结构的值,而写入/sys的文件就是设置内核中的数据结构的元素的值。
    3.一开始现有/proc文件系统,人们希望这种技术来调试内核,实际做出来后很有用,所有很多内核开发者都去内核调用代码向/proc目录中写文件,而且刚开始的内核管理者,而且刚开始的时候内核管理者对proc目录的使用也没有什么经验也没有什么统一规划,后来导致的结果就是proc里边的内容又多又杂乱。后来觉得proc中的内容太多太乱缺乏统一规划,于是又添加了sys目录。
相关推荐
欧神附体1236 分钟前
计算机网络之专业名词中英文解释(第一弹)
网络
ylscode10 分钟前
Pentest Swarm AI:开源群体智能架构如何重构自主渗透测试的边界
网络·安全·安全威胁分析
AI行业学习15 分钟前
CC-Switch 下载、安装windows\macOS \Linux 安装
linux·运维·macos
KaMeidebaby22 分钟前
卡梅德生物技术快报|基因测序技术在 46,XY 性发育障碍变异筛查中的流程与数据分析
服务器·前端·数据库·人工智能·算法·数据挖掘·数据分析
weixin_4296302626 分钟前
3.51 Centra-Net:一种跨场景的集中式视觉定位网络
网络
mosaic_born27 分钟前
systemctl restart reload enable 重启服务时的区别
linux
m0_7381207234 分钟前
渗透测试基础——黑盒测试下的Web漏洞挖掘与利用解析(二)
服务器·前端·python·网络协议·安全·网络安全
文青小兵1 小时前
Linux云计算——docker compose haibor elfk (四)
linux·服务器·docker·云计算
思麟呀1 小时前
C++11并发编程:互斥锁
linux·开发语言·c++·windows
顺风尿一寸1 小时前
深度解析 Linux touch 命令:从用户输入到磁盘 Inode 的完整旅程
linux