当前位置: 首页 > news >正文

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 来查看结果
#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 如果相等 返回值为 0if(!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目录。
http://www.lryc.cn/news/268963.html

相关文章:

  • 深入理解 YOLOv8:解析.yaml 配置文件目标检测、实例分割、图像分类、姿态检测
  • oracle与mysql的分析函数(窗口函数)
  • 《微信小程序开发从入门到实战》学习六十五
  • 开箱即用的企业级数据和业务管理中后台前端框架Ant Design Pro 5的开箱使用和偏好配置
  • 怎么用Facebook找客户?Facebook开发客户攻略分享
  • 【Vue2+3入门到实战】(12)自定义指令的基本语法(全局、局部注册)、 指令的值、v-loading的指令封装 详细示例
  • Android studio socket客户端应用设计
  • 【UTC格式】Oracle低版本实现UTC格式转换
  • [BUG] Hadoop-3.3.4集群yarn管理页面子队列不显示任务
  • Java 缓存中间件
  • 使用cmake配置matplotlibcpp生成VS项目
  • Android : 画布绘制矩形和文字 让其居中显示简单应用
  • 科研学习|论文解读——融合类目偏好和数据场聚类的协同过滤推荐算法研究
  • 算法学习系列(十五):最小堆、堆排序
  • HCIA-Datacom题库(自己整理分类的)——OSPF协议多选
  • elasticsearch-hadoop.jar 6.8版本编译异常
  • 面试经典150题(50-53)
  • Jetpack Compose中使用Android View
  • 《MySQL》事务篇
  • 高阶组件和高阶函数是什么
  • 初步认识API安全
  • MybatisX逆向工程方法
  • 每日一题:LeetCode-LCR 179. 查找总价格为目标值的两个商品
  • SpringBoot 3.2.0 基于Logback定制日志框架
  • 微软发布安卓版Copilot,可免费使用GPT-4、DALL-E 3
  • 【STM32】程序在SRAM中运行
  • docker 部署mysql
  • 科荣AIO ReportServlet存在目录遍历漏洞
  • Ubuntu Desktop 22.04 桌面主题配置
  • SuperMap iServer发布的ArcGIS REST 地图服务如何通过ArcGIS API进行要素查询