嵌入式Linux系统编程 — 5.7 Linux系统中proc文件系统

目录​​​​​​​

1 proc文件系统简介

2 proc 文件系统的使用

2.1 使用 cat 命令读取

2.2 使用 read()函数读取


1 proc文件系统简介

/proc 文件系统,也称为进程信息文件系统(Process Information file system),是一种在 Linux 和其他类 Unix 系统中存在的虚拟文件系统。它被设计用来提供一种机制,允许用户空间访问内核空间的数据结构和信息。

但是与普通文件不同的是, proc 文件系统是动态创建的,文件本身并不存在于磁盘当中、 只存在于内存当中,与 devfs 一样,都被称为虚拟文件系统。

proc 文件系统挂载在系统的/proc 目录下, 对于内核开发者(譬如驱动开发工程师)来说, proc 文件系统给了开发者一种调试内核的方法:通过查看/proc/xxx 文件来获取到内核特定数据结构的值。

可以看到/proc 目录下有很多以数字命名的文件夹,譬如 1、 138、 1833,这些数字对应的其实就是一个一个的进程 PID 号,每一个进程在内核中都会存在一个编号,通过此编号来区分不同的进程,这个编号就是 PID 号。

所以这些以数字命名的文件夹中记录了这些进程相关的信息,不同的信息通过不同的虚拟文件呈现出来。

/proc 目录下除了文件夹之外,还有很多的虚拟文件,譬如 buddyinfo、 cgroups、 cmdline、version 等等,不同的文件记录了不同信息, 关于这些文件记录的信息和意思如下:

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

2 proc 文件系统的使用

proc 文件系统的使用就是去读取/proc 目录下的这些文件,获取文件中记录的信息,可以直接使用 cat 命令读取,也可以在应用程序中调用 open()打开、然后再使用 read()函数读取。

2.1 使用 cat 命令读取

读取特定进程的命令行参数pid 应该替换为目标进程的进程ID,如下命令显示了启动该进程的完整命令行。

cat /proc/pid/cmdline

查看当前进程的环境变量/proc/self 是一个特殊的目录,它总是指向当前正在执行的进程。

cat /proc/self/environ

获取系统内存使用情况:/proc/meminfo 文件提供了系统的内存使用统计,包括总内存、空闲内存、缓冲区内存等。

cat /proc/meminfo

查看当前进程的文件描述符:/proc/self/fd/将列出当前进程打开的所有文件描述符,每个文件描述符都是一个指向实际文件的符号链接。

cat /proc/self/fd/

获取当前进程的CPU使用情况:如下命令将从 stat 文件中提取出CPU使用情况的部分。

cat /proc/stat | grep '^cpu '

查看当前进程的状态:/proc/self/status文件包含了当前进程的多种状态信息,如线程数、内存使用、用户和组ID等。

cat /proc/self/status

获取内核版本信息:/proc/version文件显示了Linux内核的版本信息。

cat /proc/version

2.2 使用 read()函数读取

在用户空间程序中使用 read() 系统调用来读取 /proc 文件系统的内容是一种常见的做法,如下程序示例使用 read() 读取内核版本信息、当前进程的文件描述符、CPU 使用情况。

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>#define BUFFER_SIZE 1024int main() 
{char buffer[BUFFER_SIZE];ssize_t bytesRead;int fd;// 读取内核版本信息fd = open("/proc/version", O_RDONLY);if (fd == -1) {perror("open /proc/version failed");return 1;}bytesRead = read(fd, buffer, BUFFER_SIZE - 1);if (bytesRead == -1) {perror("read /proc/version failed");close(fd);return 1;}buffer[bytesRead] = '\0'; // 确保字符串以空字符结尾printf("Kernel version: %s\n", buffer);close(fd);// 读取当前进程的文件描述符fd = open("/proc/self/fd", O_RDONLY | O_DIRECTORY);if (fd == -1) {perror("open /proc/self/fd failed");return 1;}// 这里我们只读取目录的第一个文件描述符作为示例bytesRead = readlinkat(fd, "0", buffer, BUFFER_SIZE - 1);if (bytesRead == -1) {perror("readlinkat failed");close(fd);return 1;}buffer[bytesRead] = '\0';printf("First file descriptor: %s\n", buffer);close(fd);// 读取CPU使用情况fd = open("/proc/stat", O_RDONLY);if (fd == -1) {perror("open /proc/stat failed");return 1;}bytesRead = read(fd, buffer, BUFFER_SIZE - 1);if (bytesRead == -1) {perror("read /proc/stat failed");close(fd);return 1;}buffer[bytesRead] = '\0';// 打印整个CPU使用情况可能很长,这里只打印前几行printf("CPU usage information:\n%.*s\n", (int)bytesRead, buffer);close(fd);return 0;
}

运行结果如下:


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/38559.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows电脑自建我的世界MC服务器并与好友远程联机游戏教程

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

08:结构体

结构体 1、为什么需要结构体2、如何定义结构体3、怎么使用结构体变量3.1、赋值和初始化3.2、结构体变量的输出 1、为什么需要结构体 为了表示一些复杂的事物&#xff0c;而普通的基本类型无法满足实际要求。什么叫结构体 把一些基本类型数据组合在一起形成的一个新的数据类型&…

高性能全局内存池

什么时候使用高性能全局内存池&#xff1f; 1.高并发下有些资源需要被频繁创建和销毁&#xff0c;我们都知道系统调用是很消耗资源的。因此&#xff0c;内存池是一块申请好的资源放在缓存里。 2.频繁使用时增加了系统内存的碎片&#xff0c;降低内存使用效率。内存分配必须起…

11083 旅游背包(优先做)

这个问题可以使用动态规划来解决。我们可以定义一个三维数组dp&#xff0c;其中dp[i][j][k]表示前i种物品&#xff0c;总体积不超过j&#xff0c;总重量不超过k的最大价值。 我们可以使用四重循环来填充这个数组。外层循环遍历所有的物品&#xff0c;第二层循环遍历所有可能的…

2024软件设计师笔记之考点版(一考就过):考试前一天 考点记忆版

软件设计师之一考就过&#xff1a;成绩版 1、栈区&#xff1a;函数调用和返回&#xff0c;由系统控制&#xff1b;存非静态局部变量&#xff1b;用栈实现嵌套调用&#xff08;递归调用&#xff09;&#xff0c;逆波兰式业绩也叫后缀式&#xff0c;用栈进行求值 2、堆区&#x…

Big Data Tools插件

一些介绍 在Jetbrains的产品中&#xff0c;均可以安装插件&#xff0c;其中&#xff1a;Big Data Tools插件可以帮助我们方便的操作HDFS&#xff0c;比如 IntelliJ IDEA&#xff08;Java IDE&#xff09; PyCharm&#xff08;Python IDE&#xff09; DataGrip&#xff08;SQL …

【RabbitMQ问题踩坑】RabbitMQ设置手动ack后,消息队列有多条消息,只能消费一条,就不继续消费了,这是为什么 ?

现象&#xff1a;我发送5条消息到MQ队列中&#xff0c;同时&#xff0c;我在yml中设置的是需要在代码中手动确认&#xff0c;但是我把代码中的手动ack给关闭了&#xff0c;会出现什么情况&#xff1f; yml中配置&#xff0c;配置需要在代码中手动去确认消费者消费消息成功&…

教学技能大赛包括哪些内容

在教育的广阔天地里&#xff0c;教师的角色至关重要。他们不仅是知识的传递者&#xff0c;更是学生心灵成长的引导者。那么&#xff0c;当教师们聚集一堂&#xff0c;参加一场教学技能大赛时&#xff0c;会有哪些内容成为他们展示自我、互相学习的舞台呢&#xff1f; 教学技能大…

瓦罗兰特报错57/error code59/报错903的解决办法

《无畏契约》在注重产品设计之预&#xff0c;也注重世界观、英雄性格的塑造&#xff0c;里面的英雄灵感来源于不同的国家和地区&#xff0c;有非常本土化的特色&#xff0c;每个英雄的性格人设非常鲜明。这些人物特色让这款游戏有了新的玩法。很多玩家都进入到游戏体验。然后有…

SeeSR: Towards Semantics-Aware Real-World Image Super-Resolution

CVPR2024 香港理工大学&OPPO&bytedancehttps://github.com/cswry/SeeSR?tabreadme-ov-file#-licensehttps://arxiv.org/pdf/2311.16518#page5.80 问题引入 因为有些LR退化情况比较严重&#xff0c;所以超分之后的结果会出现语义的不一致的情况&#xff0c;所以本文训…

Python入门 2024/7/1

目录 第一个程序hello world 数据类型 注释 变量 用type类型查看数据类型 ​编辑 数据类型转换 ​编辑 标识符 运算符 字符串的三种定义方式 字符串拼接 ​编辑​编辑 字符串格式化 第一个程序hello world 区分c和python c是printf python是print print("h…

晶振在硬件系统中的位置选择与优化策略

在现代电子设备中&#xff0c;晶振扮演着至关重要的角色&#xff0c;它们提供稳定且精确的时钟信号&#xff0c;是系统心脏般的存在。然而&#xff0c;晶振的性能不仅取决于其本身的质量&#xff0c;还与它在硬件系统中的位置选择紧密相关。一个恰当的位置能够最大限度地减少外…

基于K线最短路径构造的非流动性因子

下载地址https://download.csdn.net/download/SuiZuoZhuLiu/89492221

nodejs--【Express基本使用】

10 【Express基本使用】 https://www.expressjs.com.cn/ 基于 Node.js 平台&#xff0c;快速、开放、极简的 web 开发框架。 1.Express的安装方式 Express的安装可直接使用npm包管理器上的项目&#xff0c;在安装npm之前可先安装淘宝镜像&#xff1a; npm install -g cnpm -…

领先Intel 旗舰60%,AMD锐龙9000系桌面CPU彻底杀疯了

早在月初台北国际电脑展上&#xff0c;Intel 公布了下一代低功耗移动端处理器 Lunar Lake。 也就是第二代移动版酷睿 Ultra。 而作为叫板王&#xff0c;AMD 丝毫不怂&#xff0c;不但掏出了 Ryzen AI 300 移动端处理器应对。 还抢在 Intel 之前带来了全新一代 Zen 5 架构 Ryz…

前端vue项目升级nodejs后无法运行了

问题描述&#xff1a; 运行、打包都正常的vue项目&#xff0c;在将nodejs升级到v20.14.0后&#xff0c;均报错了&#xff1a; Error: error:0308010C:digital envelope routines::unsupported opensslErrorStack: [ error:03000086:digital envelope routines::initializ…

制造业如何拥抱数字化?百数服务商的转型策略与实践

制造业作为实体经济的主体部分&#xff0c;也是核心部分&#xff0c;发挥着基础性、主导性和引领性作用。推动制造业数字化转型是实现经济高质量发展的必由之路。 在这场数字化浪潮中&#xff0c;低代码平台作为一种新兴的技术手段&#xff0c;逐渐受到了企业的青睐。其能够在…

Web基础与HTTP协议:

Web基础与HTTP协议 Web&#xff1a;就是我们所说的页面&#xff0c;打开网站所展示的页面。&#xff08;全球广域网&#xff0c;万维网&#xff09; 分布式图形信息系统。 http https &#xff08;加密的&#xff09;超文本传输协议 分布式&#xff1a;计算机系统或者应用程序…

vue3引入本地静态资源图片

一、单张图片引入 import imgXX from /assets/images/xx.png二、多张图片引入 说明&#xff1a;import.meta.url 是一个 ESM 的原生功能&#xff0c;会暴露当前模块的 URL。将它与原生的 URL 构造器 组合使用 注意&#xff1a;填写自己项目图片存放的路径 /** vite的特殊性…

SQL注入【1】——通用漏洞/SQL注入/mysql跨库/ACCESS偏移

一、知识点: 1、脚本代码与数据库前置知识 2、Access数据库注入-简易&偏移 3、MYSQL数据库注入-简易:权限跨库 二、前置知识: &#xff08;一&#xff09;SQL注入漏洞产生原理分析 SQL注入产生条件&#xff1a;根本条件&#xff1a;可控变量、特定函数。 脚本代码在实现…