Linux proc虚拟文件系统

文章目录

    • 简介
    • proc常用节点
    • pid节点
    • procfs接口
    • 参考

简介

测试环境:Linux dev-PC 5.18.17-amd64-desktop-hwe #20.01.00.10 SMP PREEMPT_DYNAMIC Thu Jun 15 16:17:50 CST 2023 x86_64 GNU/Linux

proc虚拟文件系统是linux内核提供的一种让用户和内核内部数据结构进行交互的机制。
proc文件系统并不是真正意义上的文件系统,它存在于内存中,并不占用磁盘空间。它包含一些结构化的目录和虚拟文件,向用户呈现内核中的一些信息,也可以作为一种从用户空间向内核发送信息的手段。许多shell命令如ps、top等都是从proc文件系统中读取信息。
在测试环境中,proc文件系统挂载信息如下

proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)

proc下面的内容:

$ ls /proc
1     1150  1272  1801  25    2708  2855  3257  3489  41    5242  6236  7594  87   acpi           fb           loadavg       slabinfo
10    1151  13    1895  2507  2710  2871  3293  3492  42    5247  6454  76    88   asound         filesystems  locks         softirqs
100   116   14    19    2508  2726  2874  3295  3493  43    5258  6504  7615  89   buddyinfo      fs           mdstat        stat
101   1160  1408  2     2511  275   2898  33    3524  44    5261  6560  7642  9    bus            interrupts   meminfo       swaps
1016  1184  1428  20    2512  276   2904  3331  353   45    5262  6625  7692  90   cgroups        iomem        misc          sys
102   12    1471  2080  2515  2794  3     3346  3534  46    5277  7     77    91   cmdline        ioports      modules       sysrq-trigger
103   1203  1476  21    2581  2796  30    3390  3540  48    53    7035  78    92   consoles       irq          mounts        sysvipc
107   1209  15    22    26    2798  31    3397  3547  49    54    7053  79    93   cpuinfo        kallsyms     mtrr          thread-self
108   1213  1516  229   2632  28    3104  34    36    5     55    72    80    94   crypto         kcore        net           timer_list
11    1218  1595  2395  2673  2803  3125  340   37    50    558   73    81    95   devices        keys         pagetypeinfo  tty
110   122   16    24    2674  2810  32    3419  38    5099  56    74    82    96   diskstats      key-users    partitions    uptime
111   1222  1601  2460  2687  2821  3233  3476  386   51    57    7475  83    97   dma            kmsg         pressure      version
1124  1227  169   2461  2696  2833  3244  3478  39    516   59    7478  84    978  driver         kpagecgroup  schedstat     vmallocinfo
1132  1229  170   2477  2697  2847  3249  3484  4     517   60    7484  85    98   dynamic_debug  kpagecount   scsi          vmstat
1143  123   18    2488  27    2854  3253  3485  40    52    61    75    86    99   execdomains    kpageflags   self          zoneinfo

proc常用节点

  • cpuinfo:CPU信息
  • meminfo:内存信息
  • mounts:加载的文件系统
  • filesystems:支持的文件系统
  • modules:已加载的模块
  • cmdline:系统启动的内核命令行参数
  • <pid>:提供pid进程的信息
  • interrupts:中断使用情况
  • kmsg:内核日志信息
  • devices:可用的设备
  • slabinfo:slab系统统计信息
  • uptime:系统正常运行时间

pid节点

sudo ls /proc/5261 -lh
总用量 0
-r--r--r--  1 root root 0 29 11:57 arch_status
dr-xr-xr-x  2 dev  dev  0 29 11:57 attr
-r--------  1 root root 0 29 11:57 auxv
-r--r--r--  1 root root 0 29 11:57 cgroup
--w-------  1 root root 0 29 11:57 clear_refs
-r--r--r--  1 root root 0 29 11:39 cmdline
-rw-r--r--  1 root root 0 29 11:57 comm
-rw-r--r--  1 root root 0 29 11:57 coredump_filter
-r--r--r--  1 root root 0 29 11:57 cpu_resctrl_groups
lrwxrwxrwx  1 root root 0 29 11:57 cwd -> /
-r--------  1 root root 0 29 11:57 environ
lrwxrwxrwx  1 root root 0 29 11:38 exe -> /usr/sbin/sshd
dr-x------  2 root root 0 29 11:57 fd
dr-xr-xr-x  2 dev  dev  0 29 11:57 fdinfo
-rw-r--r--  1 root root 0 29 11:57 gid_map
-r--------  1 root root 0 29 11:57 io
-r--r--r--  1 root root 0 29 11:57 limits
-rw-r--r--  1 root root 0 29 11:57 loginuid
dr-x------  2 root root 0 29 11:57 map_files
-r--r--r--  1 root root 0 29 11:57 maps
-rw-------  1 root root 0 29 11:57 mem
-r--r--r--  1 root root 0 29 11:57 mountinfo
-r--r--r--  1 root root 0 29 11:57 mounts
-r--------  1 root root 0 29 11:57 mountstats
dr-xr-xr-x 60 dev  dev  0 29 11:57 net
dr-x--x--x  2 root root 0 29 11:57 ns
-r--r--r--  1 root root 0 29 11:57 numa_maps
-rw-r--r--  1 root root 0 29 11:57 oom_adj
-r--r--r--  1 root root 0 29 11:57 oom_score
-rw-r--r--  1 root root 0 29 11:57 oom_score_adj
-r--------  1 root root 0 29 11:57 pagemap
-r--------  1 root root 0 29 11:57 patch_state
-r--------  1 root root 0 29 11:57 personality
-rw-r--r--  1 root root 0 29 11:57 projid_map
lrwxrwxrwx  1 root root 0 29 11:57 root -> /
-rw-r--r--  1 root root 0 29 11:57 sched
-r--r--r--  1 root root 0 29 11:57 schedstat
-r--r--r--  1 root root 0 29 11:57 sessionid
-rw-r--r--  1 root root 0 29 11:57 setgroups
-r--r--r--  1 root root 0 29 11:57 smaps
-r--r--r--  1 root root 0 29 11:57 smaps_rollup
-r--------  1 root root 0 29 11:57 stack
-r--r--r--  1 root root 0 29 11:40 stat
-r--r--r--  1 root root 0 29 11:57 statm
-r--r--r--  1 root root 0 29 11:39 status
-r--------  1 root root 0 29 11:57 syscall
dr-xr-xr-x  3 dev  dev  0 29 11:57 task
-rw-r--r--  1 root root 0 29 11:57 timens_offsets
-r--r--r--  1 root root 0 29 11:57 timers
-rw-rw-rw-  1 root root 0 29 11:57 timerslack_ns
-rw-r--r--  1 root root 0 29 11:57 uid_map
-r--r--r--  1 root root 0 29 11:57 wchan

常用信息:

  • attr:安全相关属性
  • cgroups:进程所属控制组
  • cmdline:进程命令行参数
  • environ:进程环境变量
  • fd:一个包含所有进程打开的文件描述符目录
  • mem:进程内存被使用情况
  • stat:进程状态
  • status:进程当前状态
  • cwd:进程当前工作目录的链接
  • exe:指向该进程的执行命令文件
  • maps:内存映射信息
  • statm:进程内存使用信息
  • root:链接次进程的root目录
  • oom_adj、oom_score、oom_score_adj:用于OOM killer

procfs接口

procfs文件系统提供了一些API供内核中其他模块使用,这些接口或定义在头文件中或通过EXPORT_SYMBOL直接导出,代码位置在fs/proc文件夹下。
下面看下内核中misc驱动是如何使用procfs接口在proc文件系统下面创建和管理自己的节点的。
misc驱动代码位置在drivers/char/misc.c
直接看其的初始化入口:

static int __init misc_init(void)
{
	int err;
	struct proc_dir_entry *ret;

	ret = proc_create_seq("misc", 0, NULL, &misc_seq_ops);
	err = class_register(&misc_class);
	if (err)
		goto fail_remove;

	err = -EIO;
	if (register_chrdev(MISC_MAJOR, "misc", &misc_fops))
		goto fail_printk;
	return 0;

fail_printk:
	pr_err("unable to get major %d for misc devices\n", MISC_MAJOR);
	class_unregister(&misc_class);
fail_remove:
	if (ret)
		remove_proc_entry("misc", NULL);
	return err;
}

一开始其就使用了proc_create_seq创建了一个名为misc的节点。

#define proc_create_seq(name, mode, parent, ops) \
	proc_create_seq_private(name, mode, parent, ops, 0, NULL)

struct proc_dir_entry *proc_create_seq_private(const char *name, umode_t mode,
		struct proc_dir_entry *parent, const struct seq_operations *ops,
		unsigned int state_size, void *data)
{
	struct proc_dir_entry *p;

	p = proc_create_reg(name, mode, &parent, data);
	if (!p)
		return NULL;
	p->proc_ops = &proc_seq_ops;
	p->seq_ops = ops;
	p->state_size = state_size;
	return proc_register(parent, p);
}
EXPORT_SYMBOL(proc_create_seq_private);

其中misc_seq_ops是该文件节点的操作函数集,目前统一为seq_file机制:

static const struct seq_operations misc_seq_ops = {
	.start = misc_seq_start,
	.next  = misc_seq_next,
	.stop  = misc_seq_stop,
	.show  = misc_seq_show,
};

关于seq_file机制,可以参考相关文档:The seq_file Interface、内核 seq_file 操作函数、linux内核seq_file接口

下面是读取misc节点:

$ cat /proc/misc 
119 simple_virtualchardev
232 kvm
130 watchdog
235 autofs
234 btrfs-control
120 cpu_dma_latency
227 mcelog
121 vndbinder
122 hwbinder
123 binder
124 ashmem
236 device-mapper
223 uinput
  1 psaux
196 vfio
200 tun
125 udmabuf
237 loop-control
228 hpet
229 fuse
126 ecryptfs
231 snapshot
183 hw_random
127 vga_arbiter
242 rfkill

参考

The /proc Filesystem
T H E /proc F I L E S Y S T E M
The seq_file Interface
内核 seq_file 操作函数
linux内核seq_file接口

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flutter项目试水

1基本介绍 本文章在构建您的第一个 Flutter 应用指导下进行实践 可作为项目实践的辅助参考资料 Flutter 是 Google 的界面工具包&#xff0c;用于通过单一代码库针对移动设备、Web 和桌面设备构建应用。在此 Codelab 中&#xff0c;您将构建以下 Flutter 应用。 该应用可以…

第六篇:数字逻辑的“矩阵革命”——域控制器中的组合电路设计

副标题 &#xff1a;用卡诺图破解车身域控制器的逻辑迷宫&#xff0c;揭秘华为DriveONE的“数字特工” ▍ 开篇&#xff1a;黑客帝国世界观映射 > "Welcome to the Real World." —— Morpheus > 在数字逻辑的世界里&#xff0c;组合电路就是构建Matr…

成为高能量体质:从身体神庙到精神圣殿的修炼之路

清晨五点&#xff0c;当城市还在沉睡&#xff0c;瑜伽垫上的汗水已经折射出第一缕阳光。这不是苦行僧的自虐&#xff0c;而是高能量体质者的日常仪式。在这个能量稀缺的时代&#xff0c;如何把自己修炼成一座小型核电站&#xff1f;答案就藏在身体的每个细胞里。 一、能量管理…

从大规模恶意攻击 DeepSeek 事件看 AI 创新隐忧:安全可观测体系建设刻不容缓

作者&#xff1a;羿莉&#xff08;萧羿&#xff09; 全球出圈的中国大模型 DeepSeek 作为一款革命性的大型语言模型&#xff0c;以其卓越的自然语言处理能力和创新性成本控制引领行业前沿。该模型不仅在性能上媲美 OpenAI-o1&#xff0c;而且在推理模型的成本优化上实现了突破…

低成本+高性能+超灵活!Deepseek 671B+Milvus重新定义知识库搭建

“老板说&#xff0c;这个项目得上Deepseek,还得再做个知识库...” 还有哪个开发者&#xff0c;最近没听到这样的抱怨&#xff1f; Deepseek爆火&#xff0c;推理端的智能提速&#xff0c;算力成本急剧下降&#xff0c;让不少原本不想用大模型&#xff0c;用不起大模型的企业&a…

CSS 实现下拉菜单效果实例解析

1. 引言 在 Web 开发过程中&#xff0c;下拉菜单是一种常见且十分实用的交互组件。很多前端教程都提供过简单的下拉菜单示例&#xff0c;本文将以一个简洁的实例为出发点&#xff0c;从 HTML 结构、CSS 样式以及整体交互逻辑三个层面进行详细解析&#xff0c;帮助大家理解纯 C…

VSCode中出现“#include错误,请更新includePath“问题,解决方法

1、出现的问题 在编写C程序时&#xff0c;想引用头文件但是出现如下提示&#xff1a; &#xff08;1&#xff09;首先检查要引用的头文件是否存在&#xff0c;位于哪里。 &#xff08;2&#xff09;如果头文件存在&#xff0c;在编译时提醒VSCode终端中"#include错误&am…

【RabbitMQ的监听器容器Simple和Direct】 实现和场景区别

在Spring Boot中&#xff0c;RabbitMQ的两种监听器容器&#xff08;SimpleMessageListenerContainer和DirectMessageListenerContainer&#xff09;在实现机制和使用场景上有显著差异。以下是它们的核心区别、配置方式及最佳实践&#xff1a; Simple类型 Direct类型 一、核心…

yolo11自训练极简教程 - 训练侦测

去年我处理过的最后一个版本是yolov10.新年再次着手处理视频识别的工作。发现自清华的v10之后&#xff0c;去年下半年v11再次发布了。国内访问github有些问题&#xff0c;但是yolo网站是可以方便访问的&#xff1a; Train - Ultralytics YOLO Docs 国外的知识库做的很棒&…

大数据学习之SparkStreaming、PB级百战出行网约车项目一

一.SparkStreaming 163.SparkStreaming概述 Spark Streaming is an extension of the core Spark API that enables scalable, high-throughput, fault-tolerant stream processing of live data streams. Spark Streaming 是核心 Spark API 的扩展&#xff0c;支持实时数据…

day5QT套接字通信

Widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);objtimer new QTimer (this);//连接定时器的timeout信号到启动的槽函数//connect(objtimer,&…

【免费】2007-2020年各省医疗卫生支出数据

2007-2020年各省医疗卫生支出数据 1、时间&#xff1a;2007-2020年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区名称、年份、医疗卫生支出 4、范围&#xff1a;31省 5、指标说明&#xff1a;地方财政医疗卫生支出是指地方ZF从其财政预…

本地基于GGUF部署的DeepSeek实现轻量级调优之二:检索增强生成(RAG)

前文&#xff0c;我们在本地windows电脑基于GGUF文件&#xff0c;部署了DeepSeek R1 1.5B模型&#xff0c;如果想在离线模式下加载本地的DeepSeek模型自行对进行训练时&#xff0c;是不能直接使用GGUF文件进行训练的&#xff0c;但是可以对模型进行微调&#xff0c;以下说的是第…

16vue3实战-----动态路由

16vue3实战-----动态路由 1.思路2.实现2.1创建所有的vue组件2.2创建所有的路由对象文件(与上述中的vue文件一一对应)2.3动态加载所有的路由对象文件2.4根据菜单动态映射正确的路由2.5解决main页面刷新的问题2.6解决main的第一个页面匹配显示的问题2.7根据path匹配menu 1.思路 …

WPS如何接入DeepSeek(通过JS宏调用)

WPS如何接入DeepSeek 一、文本扩写二、校对三、翻译 本文介绍如何通过 WPS JS宏调用 DeepSeek 大模型&#xff0c;实现自动化文本扩写、校对和翻译等功能。 一、文本扩写 1、随便打开一个word文档&#xff0c;点击工具栏“工具”。 2、点击“开发工具”。 3、点击“查看代码”…

前端快速生成接口方法

大家好&#xff0c;我是苏麟&#xff0c;今天聊一下OpenApi。 官网 &#xff1a; umijs/openapi - npm 安装命令 npm i --save-dev umijs/openapi 在根目录&#xff08;项目目录下&#xff09;创建文件 openapi.config.js import { generateService } from umijs/openapi// 自…

云消息队列 ApsaraMQ Serverless 演进:高弹性低成本、更稳定更安全、智能化免运维

如今&#xff0c;消息队列已成为分布式架构中不可或缺的关键服务&#xff0c;为电商、物联网、游戏和教育等行业&#xff0c;提供了异步解耦、集成、高性能和高可靠的核心价值。 过去一年&#xff0c;我们发布了云消息队列 ApsaraMQ 全系列产品 Serverless 化&#xff0c;面向…

Spring依赖注入方式

写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油&#xff0c;冲鸭&#x…

Mysql索引失效的场景

对索引列使用函数或表达式&#xff0c;或参与计算&#xff08;优化方法&#xff1a;将计算移到条件右侧&#xff1a;&#xff09;例 优化 对索引列进行隐式类型转换&#xff0c;条件中的数据类型与索引列的数据类型不匹配&#xff0c;会进行隐式类型转换 以like 通配符开头索…

CTFHub-RCE系列wp

目录标题 引言什么是RCE漏洞 eval执行文件包含文件包含php://input读取源代码远程包含 命令注入无过滤过滤cat过滤空格过滤目录分隔符过滤运算符综合过滤练习 引言 题目共有如下类型 什么是RCE漏洞 RCE漏洞&#xff0c;全称是Remote Code Execution漏洞&#xff0c;翻译成中文…