【Linux】proc 文件系统详解

在这里插入图片描述

/proc 文件系统是 Linux 内核提供的一种特殊的文件系统,它主要用于显示内核和进程的信息。/proc 文件系统是一个虚拟文件系统,这意味着它并不占用实际的磁盘空间,而是由内核动态生成的内容。通过 /proc 文件系统,用户可以读取系统的状态信息,也可以对某些内核参数进行修改。本文将详细介绍 /proc 文件系统的结构、功能及其使用方法。

1. /proc 文件系统的概述

/proc 文件系统位于文件系统的根目录下,通常表现为 /proc 目录。这个目录包含了许多子目录和文件,它们代表了系统中的各种资源和状态信息。例如,每个正在运行的进程都会在 /proc 中有一个对应的子目录,其名称为该进程的 PID(进程标识符)。

2. /proc 文件系统的目录结构

2.1 进程相关目录

每个进程都有一个与之相对应的子目录,其名字是该进程的 PID。在这个子目录下,可以找到有关该进程的各种信息。

  • /proc/<PID>/cmdline:显示进程的命令行参数。
  • /proc/<PID>/cwd:指向当前工作目录的符号链接。
  • /proc/<PID>/exe:指向可执行文件的符号链接。
  • /proc/<PID>/fd:显示进程的文件描述符,每个文件描述符都是一个指向打开文件的符号链接。
  • /proc/<PID>/maps:显示进程的虚拟内存映射信息。
  • /proc/<PID>/mem:允许读写进程的内存,但是默认禁用。
  • /proc/<PID>/root:指向进程的根文件系统的符号链接。
  • /proc/<PID>/status:显示进程的状态信息。
  • /proc/<PID>/stat:显示进程的统计信息。
  • /proc/<PID>/task/<TID>:指向线程组成员的目录。
2.2 系统范围的文件

除了进程相关的目录外,/proc 文件系统还包括一些系统范围的文件,它们提供了整个系统的概览信息。

  • /proc/cpuinfo:显示 CPU 的相关信息。
  • /proc/meminfo:显示内存使用的相关信息。
  • /proc/filesystems:列出系统支持的所有文件系统类型。
  • /proc/version:显示内核版本信息。
  • /proc/modules:列出所有已加载的内核模块。
  • /proc/interrupts:显示中断请求的信息。
  • /proc/partitions:显示磁盘分区的信息。
  • /proc/net:包含网络相关的信息。
  • /proc/sys:包含可以动态修改的内核参数。

3. 使用 /proc 文件系统

3.1 查看系统信息

通过查看 /proc 中的文件,可以获取大量的系统信息。以下是一些常用的命令示例:

  • 查看系统支持的文件系统类型:

    cat /proc/filesystems
    
  • 查看当前系统中所有进程的信息:

    ls /proc
    
  • 查看某个特定进程的命令行参数:

    cat /proc/<PID>/cmdline
    
  • 查看系统总的内存使用情况:

    cat /proc/meminfo
    
  • 查看 CPU 的信息:

    cat /proc/cpuinfo
    
3.2 修改内核参数

/proc/sys 目录下包含了许多可以动态修改的内核参数。这些参数可以用于调整系统的行为。例如,要修改 IP 协议的转发功能,可以编辑 /proc/sys/net/ipv4/ip_forward 文件:

echo 1 > /proc/sys/net/ipv4/ip_forward

此命令将 IP 转发功能开启。需要注意的是,修改这些参数可能会影响系统的稳定性或安全性,因此在修改之前应该了解这些参数的具体作用。

4. 自定义 /proc 文件

除了系统自带的 /proc 文件之外,内核开发人员也可以创建自己的 /proc 文件来提供额外的功能。要创建一个自定义的 /proc 文件,通常需要注册一个 proc 文件系统入口点,并实现相应的读写函数。

以下是一个简单的示例,展示如何在内核模块中创建一个自定义的 /proc 文件:

4.1 模块初始化
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/proc_fs.h>
#include <linux/uaccess.h>static int custom_proc_show(struct seq_file *m, void *v);
static ssize_t custom_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos);
static int custom_proc_open(struct inode *inode, struct file *file);static const struct file_operations custom_proc_fops = {.owner          = THIS_MODULE,.read           = seq_read,.write          = custom_proc_write,.llseek         = seq_lseek,.release        = single_release,
};static struct proc_dir_entry *custom_proc_entry;static int __init custom_proc_init(void)
{custom_proc_entry = proc_create("custom_proc", 0644, NULL, &custom_proc_fops);if (!custom_proc_entry)return -ENOMEM;return 0;
}module_init(custom_proc_init);static void __exit custom_proc_exit(void)
{remove_proc_entry("custom_proc", NULL);
}module_exit(custom_proc_exit);MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple module that creates a custom /proc entry.");static int custom_proc_show(struct seq_file *m, void *v)
{seq_printf(m, "This is a custom proc file.\n");return 0;
}static int custom_proc_open(struct inode *inode, struct file *file)
{return single_open(file, custom_proc_show, NULL);
}static ssize_t custom_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
{char buf[256];if (count >= sizeof(buf))count = sizeof(buf) - 1;if (copy_from_user(buf, buffer, count))return -EFAULT;buf[count] = '\0';printk(KERN_INFO "Received data: %s\n", buf);return count;
}
4.2 编译和加载模块

编译模块:

make -C /lib/modules/$(uname -r)/build M=$(pwd) modules

加载模块:

insmod custom_proc.ko

查看创建的文件:

cat /proc/custom_proc

写入数据:

echo "Hello" > /proc/custom_proc

5. 总结

/proc 文件系统是 Linux 内核提供的一种强大而灵活的工具,用于获取系统和进程的信息,并允许动态调整某些内核参数。通过理解 /proc 文件系统的结构和功能,开发者可以更好地监控和调试系统。此外,内核开发者还可以利用 /proc 文件系统来创建自定义的文件,以扩展内核的功能。希望本文能够帮助读者更好地理解和使用 /proc 文件系统,提高 Linux 系统管理和开发的效率。在实际应用中,可以根据具体需求灵活运用这些技巧,确保系统的稳定性和高效性。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Linux文件系统

Linux文件系统 Linux 文件系统是 Linux 操作系统中用于存储和组织文件的结构。以下是一些关键概念和常见的 Linux 文件系统类型&#xff1a; 关键概念 文件系统层次结构&#xff1a;Linux 使用统一的文件系统层次结构&#xff0c;所有文件和目录都从根目录 / 开始。 目录结构…

[1.15.X-1.18.X]Herobrine-吾王HIM插件

Herobrine 这款插件99%自定义!为你的服务器增加一个吓人的HIM&#xff0c;该插件是一个非玩家角色&#xff0c;由 Minecraft 的粉丝创建。从来没有真正成为 Minecraft 游戏的一部分&#xff0c;这个故事是他在 Minecraft 世界里出没&#xff0c;Mojang 通过开玩笑地将“移除的 …

CTF 取证技术

01 流量分析 筛选器的使用 追踪流 文件导出 实例&#xff1a;通过筛选 http ,推断出 攻击者很可能 是 执行一个 文件上传 的攻击hack.php 很可能就是 攻击者 上传的 webshell依次进行 http 的 追踪流 查看查看到最后&#xff0c;发现响应中 有 PK文件头的存在 &#xff0c;说…

【GPIO】3.上/下 拉电阻通讯中的作用

一.什么是上/下拉电阻 上拉、下拉电阻统一称为拉电阻&#xff0c;作用是将状态不确定的信号线通过一个电阻将其箝位至高电平&#xff08;上拉&#xff09;或低电平&#xff08;下拉&#xff09; 这里有人可能会疑惑&#xff1f; 什么叫状态不确定的信号&#xff1f; 在数字电…

分享购:前期布局与后期问题解决策略

在当今电商与消费模式不断创新的时代&#xff0c;分享购作为一种极具潜力的商业模式&#xff0c;正受到越来越多的关注。然而&#xff0c;要想让分享购真正发挥优势、实现可持续发展&#xff0c;无论是前期的精心布局&#xff0c;还是后期妥善应对各类问题&#xff0c;都至关重…

51c大模型~合集46

我自己的原文哦~ https://blog.51cto.com/whaosoft/11908179 #HITS 北大李戈团队提出大模型单测生成新方法&#xff0c;显著提升代码测试覆盖率 单元测试是软件开发流程中的一个关键环节&#xff0c;主要用于验证软件中的最小可测试单元&#xff0c;函数或模块是否按预期工作…

中断与异常处理:走进代码

在操作系统的核心部分&#xff0c;中断&#xff08;Interrupt&#xff09;和异常&#xff08;Exception&#xff09;的处理机制是不可或缺的基础。它们的设计决定了系统的响应能力、稳定性和可扩展性。本文将深入探讨 Linux 内核中的中断与异常处理机制&#xff0c;并结合更多实…

智慧社区管理系统平台全面提升物业管理效率与用户体验

内容概要 随着科技的发展&#xff0c;智慧社区管理系统平台应运而生&#xff0c;成为现代物业管理的重要工具。这个平台通过整合多种先进的管理手段&#xff0c;为物业服务提供了全新的解决方案。智慧社区管理系统的核心在于其高效、便捷、智能的特点&#xff0c;最大程度地提…

Pytest-Bdd-Playwright 系列教程(9):使用 数据表(DataTable 参数) 来传递参数

Pytest-Bdd-Playwright 系列教程&#xff08;9&#xff09;&#xff1a;使用 数据表&#xff08;DataTable 参数&#xff09; 来传递参数 前言一、什么是 datatable 参数&#xff1f;Gherkin 表格示例 二、datatable 参数的基本使用三、完整代码和运行效果完整的测试代码 前言 …

Java学习——Day10

static修饰的成员变量和方法&#xff0c;从属与类。普通变量和方法从属于对象的 静态块就是类在初始化的执行的语句块&#xff0c;静态块中常调用静态变量和静态方法。 以下编写一段代码举个例子 Java参数传值机制 java中&#xff0c;方法中所有参数都是“值传递”&#xff…

StructRAG Boosting Knowledge 论文笔记

StructRAG: Boosting Knowledge Intensive Reasoning of LLMs via Inference-time Hybrid Information Structurization 论文精读 背景知识 知识密集型推理任务&#xff08;knowledeg- intensive reasoning task&#xff09;: 知识密集型推理任务&#xff08;knowledge-inte…

【点云上采样】最近邻插值上采样算法 增加点云密度

看了很多文章都是用CGAL去做的&#xff0c;又是下载安装CGAL的贼麻烦&#xff0c;关键弄好还不能用&#xff0c;气死了。 文章目录 前言一、最近邻插值上采样算法1、原理&#xff1a;2、步骤&#xff1a; 二、完整代码三、效果对比 前言 传感器采集到的点云比较稀疏&#xff0…

C++仿函数

概念 仿函数本质上是一个类&#xff08;class&#xff09;或者结构体&#xff08;struct&#xff09;&#xff0c;不过这个类重载了函数调用运算符 operator()&#xff0c;使得它的实例对象可以像函数那样被调用。从使用方式上看&#xff0c;它能表现出类似函数的行为&#xf…

【Linux进程基础篇】总结 | => 进程环境变量(超详细)

-------------------------------------------------------------------------------------------------------------------------------- 每日鸡汤&#xff1a;Never frown&#xff0c; even when you are sad&#xff0c; because you never know who is falling in love wi…

PowerBI 无法拖动字段到组件上

今天在做PowerBI时发现一个奇怪的问题。 本来好好的报表&#xff0c;突然无法拖动字段到组件上。 后来在网上搜索相关问题&#xff0c;发现原因可能是因为"隐式度量值"被禁用。 就是说报表无法自动聚合计算&#xff0c;所以无法拖动字段到组件上。 正确的: 有问题…

熟食店称重计价秤软件下载 佳易王触摸屏称重自动读取重量自动计算金额系统操作教程

一、概述 【软件资源文件下载在文章最后】 熟食店称重计价秤软件下载 触摸屏称重自动读取重量自动计算金额系统操作教程 1、软件可以自动读取称的重量。2、自动计算金额并累计。不需打印条形码直接称重计算&#xff0c;节省人力和时间。 软件同时支持称重商品和条形码百货商…

十一 手写Spring框架

十一、手写Spring框架 Spring IoC容器的实现原理&#xff1a;工厂模式 解析XML 反射机制。 我们给自己的框架起名为&#xff1a;loveSpring 第一步&#xff1a;创建模块loveSpring 采用Maven方式新建Module&#xff1a;loveSpring 打包方式采用jar&#xff0c;并且引入do…

360多模态及文档理解大模型技术亮相全球机器学习技术大会,共探AI技术新前沿...

北京&#xff0c;2024年11月15日 —— 在人工智能技术飞速发展的今天&#xff0c;全球技术生态正经历着深刻的变革。2024全球机器学习技术大会&#xff08;北京站&#xff09;于11月14-15日在北京举行&#xff0c;汇聚了顶尖的AI专家、学者和行业实践者&#xff0c;共同探讨机器…

六自由度双足机器人运动控制

最近迷上了研究机器人&#xff0c;花了很多时间研究机器人的控制和交互。先后开发出来了四足四自自由度&#xff0c;四足八自由度&#xff0c;两足四自由度&#xff0c;两足六自由度机器人&#xff0c;并为他们开发了相应的大模型语音交互。通过努力&#xff0c;既锻炼了动手组…

shell脚本(2)

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址&#xff1a;shell编程&#xff08;2&#xff09;永久环境变量和字符串显位_哔哩哔哩_bilibili 本文主要讲解临时变量和永久变量以及字符串长度截取操作。 一…