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

嵌入式Linux:proc文件系统

目录

1、使用 cat 命令读取 /proc 文件系统

2、在应用程序中使用 open() 和 read() 函数读取 /proc 文件系统


proc 文件系统是一个虚拟文件系统,它以文件系统的形式为应用层提供访问系统内核数据的接口。用户和应用程序可以通过 proc 文件系统获取系统信息和进程相关信息,对 proc 文件系统的读写相当于与内核进行通信。然而,与普通文件不同,proc 文件系统是动态创建的,文件本身并不存在于磁盘中,只存在于内存中。因此,它被称为虚拟文件系统,类似于 devfs。

proc 文件系统特点如下:

  • 动态创建:proc 文件系统中的文件是动态生成的,实时反映系统和进程的状态。
  • 内核信息访问:最初,proc 文件系统是为了提供有关系统中进程的信息,但由于其高效和便捷,很多内核信息也开始通过它进行报告或启用动态运行时配置。
  • 可视化数据:内核将运行时的一些关键数据以文件的形式呈现在 proc 文件系统的特定文件中,使得应用层可以以可视化方式访问这些数据结构。

proc 文件系统通常挂载在系统的 /proc 目录下。对于内核开发者(如驱动开发工程师)来说,proc 文件系统提供了一种调试内核的方法:通过查看 /proc/xxx 文件,可以获取内核特定数据结构的值,对比添加新功能前后的数据变化,从而判断该功能的影响是否合理。

/proc 目录下包含了一些重要的目录和虚拟文件如下所示:

/proc 目录下,可以看到许多以数字命名的文件夹,例如 100038229998560 等。这些数字对应的是各个进程的 PID(进程标识符)。每个进程在内核中都有一个唯一的编号,即 PID,用来区分不同的进程。这些以数字命名的文件夹中记录了各个进程的相关信息。不同的信息通过不同的虚拟文件呈现。

以下是对 /proc 目录下各个文件和子目录的详细说明:

进程相关信息

  • /proc/[pid]:每个正在运行的进程都有一个对应的目录,[pid] 是进程的 ID,包含了关于该进程的各种信息。
    • /proc/[pid]/cmdline:启动该进程的命令行参数。
    • /proc/[pid]/cwd:指向进程当前的工作目录的符号链接。
    • /proc/[pid]/environ:进程的环境变量。
    • /proc/[pid]/exe:指向进程的可执行文件的符号链接。
    • /proc/[pid]/fd/:包含指向进程打开的文件描述符的符号链接。
    • /proc/[pid]/stat:进程的状态信息,包含进程的详细状态。
    • /proc/[pid]/status:进程的状态信息,以更易读的格式显示。

系统相关信息

  • /proc/cpuinfo:关于 CPU 的详细信息,包括每个 CPU 的型号、频率、缓存大小等。
  • /proc/meminfo:关于系统内存的详细信息,包括总内存、可用内存、缓存大小等。
  • /proc/uptime:系统启动后的时间和空闲时间。
  • /proc/version:内核版本信息,包括编译者和编译时间。
  • /proc/loadavg:系统负载平均值,显示最近 1、5、15 分钟的系统平均负载。
  • /proc/filesystems:内核支持的文件系统列表。
  • /proc/sys/:内核参数的配置,通过该目录可以调整和查看内核参数。

其他有用的虚拟文件

  • /proc/cmdline:内核启动参数。
  • /proc/iomem:IO 设备的内存使用情况。
  • /proc/interrupts:显示被占用的中断号和占用者相关的信息。
  • /proc/ioports:IO 端口的使用情况。
  • /proc/kcore:系统物理内存映像,不可读取,一般用于内核调试。
  • /proc/loadavg:系统平均负载。
  • /proc/meminfo:物理内存和交换分区使用情况。
  • /proc/modules:当前加载的内核模块列表。
  • /proc/mounts:当前挂载的文件系统列表。
  • /proc/partitions:系统识别的分区表。
  • /proc/swaps:交换分区的利用情况。
  • /proc/version:内核版本信息。
  • /proc/uptime:系统运行时间。

1、使用 cat 命令读取 /proc 文件系统

cat 命令是一个简单且常用的方式来读取 /proc 目录下的虚拟文件。

查看内核版本:

cat /proc/version

输出类似于:

Linux version 5.4.0-42-generic (buildd@lgw01-amd64-040) (gcc version 9.3.0 (Ubuntu 9.3.0-10ubuntu2)) #46-Ubuntu SMP Fri Jul 10 00:24:02 UTC 2020

查看系统负载:

cat /proc/loadavg

输出类似于:

0.00 0.01 0.05 1/103 1234

2、在应用程序中使用 open()read() 函数读取 /proc 文件系统

在编程中,可以使用标准的文件操作函数来读取 /proc 文件系统中的内容。以下是一个简单的 C 程序示例:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>#define BUFFER_SIZE 1024void read_proc_file(const char *filepath) {int fd = open(filepath, O_RDONLY);if (fd == -1) {perror("open");exit(EXIT_FAILURE);}char buffer[BUFFER_SIZE];ssize_t bytesRead;while ((bytesRead = read(fd, buffer, sizeof(buffer) - 1)) > 0) {buffer[bytesRead] = '\0';printf("%s", buffer);}if (bytesRead == -1) {perror("read");close(fd);exit(EXIT_FAILURE);}close(fd);
}int main() {read_proc_file("/proc/version");return 0;
}

输出类似于:

Linux version 5.4.0-42-generic (buildd@lgw01-amd64-040) (gcc version 9.3.0 (Ubuntu 9.3.0-10ubuntu2)) #46-Ubuntu SMP Fri Jul 10 00:24:02 UTC 2020

通过 cat 命令和编程接口,用户和开发者可以方便地访问和读取 /proc 文件系统中的实时信息。这些信息对于系统监控、调试和优化非常有用。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Scratch魔法课堂:开启编程奇幻之旅
  • 【排序篇】实现快速排序的三种方法
  • 动手学深度学习(pytorch)学习记录9-图像分类数据集之Fashion-MNIST[学习记录]
  • Vue的本地部署
  • LVS配置
  • Facebook的区块链技术:提升数据安全与隐私保护
  • Go更换国内源配置环境变量
  • XSS反射型和DOM型+DOM破坏
  • 【学习总结】JVM篇
  • 快速把文件名统计到excel表的方法
  • Kafka环境搭建
  • uniapp vue 在适配百度小程序平台动态:style
  • python实现人脸轮廓提取(开操作和闭操作)
  • EmguCV学习笔记 VB.Net和C# 下的OpenCv开发
  • Python爬虫-批量爬取七猫中文网小说
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • create-react-app项目添加less配置
  • Docker 笔记(2):Dockerfile
  • happypack两次报错的问题
  • HomeBrew常规使用教程
  • MySQL主从复制读写分离及奇怪的问题
  • REST架构的思考
  • vue--为什么data属性必须是一个函数
  • 彻底搞懂浏览器Event-loop
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 基于遗传算法的优化问题求解
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 我感觉这是史上最牛的防sql注入方法类
  • 译自由幺半群
  • 在Mac OS X上安装 Ruby运行环境
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​如何防止网络攻击?
  • #pragma once
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (Matlab)使用竞争神经网络实现数据聚类
  • (poj1.3.2)1791(构造法模拟)
  • (第三期)书生大模型实战营——InternVL(冷笑话大师)部署微调实践
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (黑马C++)L06 重载与继承
  • (回溯) LeetCode 77. 组合
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (四)Linux Shell编程——输入输出重定向
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .gitignore文件---让git自动忽略指定文件
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .NET Core 项目指定SDK版本
  • .Net Memory Profiler的使用举例
  • .NET Micro Framework初体验(二)
  • .NET Reactor简单使用教程
  • .net 获取某一天 在当月是 第几周 函数
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件