Linux:虚拟文件系统/proc和self进程

embedded/2024/11/15 4:39:29/

相关阅读

Linuxicon-default.png?t=O83Ahttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm=1001.2014.3001.5482


/proc目录

        在Linux操作系统中,目录/proc是一个虚拟文件系统,称为procfc,用于访问内核和系统的实时状态信息。这个文件系统不同于常规文件系统,因为它并不存储在磁盘上,而是动态生成的。它的内容反映了当前系统的内核状态和运行中的进程信息,主要用于系统管理和调试。

        每个正在运行的进程,都会在目录/proc下用一个子目录表示,目录名为进程的id号,例如,子目录/proc/1234会包含id号为1234的进程的相关信息。当一个进程创建时,操作系统会为其分配一个未使用的id号并在目录/proc下创建相应的目录;当一个进程执行完毕退出时,操作系统会删除相应的目录并回收id号。

        例1已一个后台运行的sleep命令说明了上述过程。

# 例1
[zhangchen@EDA ~]$ sleep 10 & # 一个后台执行的测试命令
[1] 4533
[zhangchen@EDA ~]$ ls -al /proc
***
dr-xr-xr-x. 9 zhangchen zhangchen 0 Sep 20 20:27 4533
***
# 等待10秒后
[zhangchen@EDA ~]$ ls -al /proc/4533
ls: cannot access /proc/4533: No such file or directory

        在sleep命令执行后,目录/proc下多出了一个名为4533的子目录,而在10秒后sleep命令执行完毕,此时名为4533的子目录消失了(前提是此时操作系统没有将id号4533其分配给其他进程)。

        例2展示了使用ls命令来显示Bash进程目录下的内容以及它们的简介。

# 例2
[zhangchen@EDA ~]$ ps # 查询Bash进程的id号PID TTY          TIME CMD4934 pts/0    00:00:00 bash6192 pts/0    00:00:00 ps
[zhangchen@EDA ~]$ ls -al /proc/4934 # 显示虚拟文件系统中Bash进程目录
total 0
dr-xr-xr-x.   9 zhangchen zhangchen 0 Sep 20 20:30 .
dr-xr-xr-x. 385 root      root      0 Sep 20 20:22 ..
dr-xr-xr-x.   2 zhangchen zhangchen 0 Sep 20 20:37 attr # 包含与进程相关的属性(如安全属性)
-rw-r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 autogroup # 显示进程的自动调度组信息,用于CPU调度优化
-r--------.   1 zhangchen zhangchen 0 Sep 20 20:37 auxv # 包含传递给进程的辅助向量,描述了进程运行时的环境
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 cgroup # 显示该进程所属的控制组(cgroup),用于资源控制
--w-------.   1 zhangchen zhangchen 0 Sep 20 20:37 clear_refs # 用于清除内存页的引用计数,主要用于内存分析
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:30 cmdline # 包含进程启动时的命令行参数
-rw-r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 comm # 显示进程的简短名称(通常是执行的命令名)
-rw-r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 coredump_filter # 控制生成核心转储时包含的内存段
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 cpuset # 显示进程的CPU集设置,用于控制该进程在哪些CPU上运行
lrwxrwxrwx.   1 zhangchen zhangchen 0 Sep 20 20:37 cwd -> /home/zhangchen # 一个指向该进程的当前工作目录的符号链接
-r--------.   1 zhangchen zhangchen 0 Sep 20 20:37 environ # 包含进程的环境变量信息
lrwxrwxrwx.   1 zhangchen zhangchen 0 Sep 20 20:30 exe -> /usr/bin/bash # 一个指向正在执行的可执行文件的路径
dr-x------.   2 zhangchen zhangchen 0 Sep 20 20:30 fd # 包含进程打开的文件描述符的符号链接,指向相应的资源
dr-x------.   2 zhangchen zhangchen 0 Sep 20 20:37 fdinfo # 目录提供与文件描述符相关的详细信息
-rw-r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 gid_map # 显示进程的组ID映射,用于用户命名空间
-r--------.   1 zhangchen zhangchen 0 Sep 20 20:37 io # 显示与该进程相关的I/O统计信息,例如读取和写入的字节数
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 limits # 包含该进程的资源限制(如文件大小、内存限制等)
-rw-r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 loginuid # 显示登录用户的UID,用于审计
dr-x------.   2 zhangchen zhangchen 0 Sep 20 20:37 map_files # 包含该进程内存映射的文件
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 maps # 显示进程的内存映射,包含所有加载到进程地址空间的文件和库
-rw-------.   1 zhangchen zhangchen 0 Sep 20 20:37 mem # 显示该进程的虚拟内存信息
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 mountinfo # 提供关于进程挂载点的详细信息
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 mounts # 提供进程的挂载点信息,但它的输出格式较为简洁
-r--------.   1 zhangchen zhangchen 0 Sep 20 20:37 mountstats # 提供进程挂载点的性能统计信息
dr-xr-xr-x.   6 zhangchen zhangchen 0 Sep 20 20:37 net # 包含进程的网络相关信息
dr-x--x--x.   2 zhangchen zhangchen 0 Sep 20 20:37 ns # 提供与进程相关的命名空间信息,如网络、PID 和 UTS 等命名空间
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 numa_maps # 显示进程的NUMA(非一致性内存访问)节点分配
-rw-r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 oom_adj # 控制进程被OOM killer(内存不足杀手)选择的优先级。
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 oom_score # 显示该进程的OOM killer分数
-rw-r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 oom_score_adj # 控制进程被OOM killer(内存不足杀手)选择的优先级。
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 pagemap # 提供与进程页表相关的详细信息
-r--------.   1 zhangchen zhangchen 0 Sep 20 20:37 patch_state # 跟踪补丁应用状态
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 personality # 显示和设置进程的执行环境(“个性”)参数
-rw-r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 projid_map # 显示进程的项目ID映射
lrwxrwxrwx.   1 zhangchen zhangchen 0 Sep 20 20:37 root -> / # 该进程的根目录符号链接。通常指向/
-rw-r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 sched # 提供该进程的调度信息,包括调度统计数据和相关状态
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 schedstat # 提供该进程的调度信息,包括调度统计数据和相关状态
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 sessionid # 显示进程的会话ID
-rw-r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 setgroups # 控制该进程是否可以设置新的组ID
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 smaps # 提供内存映射的详细信息,包括每个映射的大小和属性
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 stack # 显示该进程的内核堆栈信息
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:30 stat # 包含进程的详细状态信息(如CPU使用、进程状态等)
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 statm # 显示进程的内存使用情况
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:30 status # 提供进程的概述,包括 PID、状态、内存使用、权限等
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 syscall # 显示该进程当前正在调用的系统调用信息
dr-xr-xr-x.   3 zhangchen zhangchen 0 Sep 20 20:37 task # 包含该进程的所有线程的子目录,每个线程都有一个独立的目录,类似于/proc的结构
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 timers # 提供该进程的定时器信息
-rw-r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 uid_map # 显示进程的用户ID映射
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 wchan # 显示进程当前正在等待的内核函数的名称

        链接文件cwd指向命令执行时的当前工作目录,但它一定是有效的当前工作目录呢?答案不然。可以进行一个小测试,比如首先使用cd命令进入一个目录然后删除它,此时执行的任何命令所创建的任何进程,都没有有效的当前工作目录,如例3所示(这是一个找茬的例子,一般不会发生)。

# 例3
[zhangchen@EDA ~]$ mkdir dir
[zhangchen@EDA ~]$ cd dir
[zhangchen@EDA dir]$ rm ~/dir
[zhangchen@EDA dir]$ sleep 20 &
[1] 12690
[zhangchen@EDA dir]$ ls /proc/12690/cwd -al
lrwxrwxrwx. 1 zhangchen zhangchen 0 Sep 21 00:26 /proc/12690/cwd -> /home/zhangchen/dir (deleted) # 在Redhat系统中,/proc/12690/cwd会被标红,/home/zhangchen/dir (deleted)会闪烁

self进程

        /proc/self是一个链接文件,指向了当前进程的目录,也就是说如果使用ls -al /proc/self命令,则显示其指向的是进程ls的目录,因为访问目录/proc/self时ls进程正在执行,如例4所示。

# 例4
[zhangchen@EDA ~]$ ls -al /proc/self # 查询当前进程(即ls)的信息
lrwxrwxrwx. 1 root root 0 Sep 20 23:26 /proc/self -> 5256 # 指向了/proc/5256
[zhangchen@EDA ~]$ ls -al /proc/self # 查询当前进程(即ls)的信息
lrwxrwxrwx. 1 root root 0 Sep 20 23:26 /proc/self -> 5371 # 指向了/proc/5371
[zhangchen@EDA ~]$ ls -al /proc/self # 查询当前进程(即ls)的信息
lrwxrwxrwx. 1 root root 0 Sep 20 23:26 /proc/self -> 5434 # 指向了/proc/5434

        从例4中可以看出 ,连续三次使用ls命令得到的结果是不同的,这是因为每次执行ls命令都会创建一个新的进程并分配给一个未使用的id号(它们可能相等,因为执行完毕后id号会被回收,但在该例中不相等)。

        如果使用cd命令进入/proc/self,按上面的说法会进入cd进程目录,但它在命令执行完后就被删除了,这会导致第一小节说的无效当前工作目录的问题吗?例5是一个测试。

# 例5
[zhangchen@EDA ~]$ cd /proc/self
[zhangchen@EDA self]$ ls -al cwd exe
lrwxrwxrwx. 1 zhangchen zhangchen 0 Sep 21 00:48 cwd -> /proc/10354
lrwxrwxrwx. 1 zhangchen zhangchen 0 Sep 21 00:11 exe -> /usr/bin/bash

        可以看出,当前工作目录是有效的,而链接文件exe指向的居然是Bash命令的路径!这其实是Bash的进程目录。这是因为对于一些内建命令,不会创建子进程执行,而是直接在当前Bash进程中执行,可以使用type来检测一个命令是否为内建命令,如例6所示。

# 例6
[zhangchen@EDA ~]$ type cd
cd is a shell builtin

http://www.ppmy.cn/embedded/115300.html

相关文章

Microsoft 365 Copilot: Wave 2 发布,开启AI时代下的全新工作流

本周一(9月16日),微软对 Microsoft 365 Copilot 办公辅助工具进行了重大升级,推出 Wave 2 版本。新版 Copilot 将为 Microsoft 365 用户带来一系列新功能和改进,进一步提升工作效率与用户体验,正式开启AI时…

【计算机网络】初识网络

初识网络 初识网络网络的发展局域网广域网 网络基础IP地址端口号协议五元组协议分层OSI 七层模型TCP/IP五层模型封装和分用"客户段-服务器"结构 初识网络 网络的发展 在过去网络还没有出现的时候, 我们的计算机大部分都是独自运行的, 比如以前那些老游戏, 都是只能…

用Inno Setup打包QT程序输出安装包

InnoSetup打包编译好的QT程序 文章目录 InnoSetup打包编译好的QT程序介绍具体步骤自定义脚本更改引入配置文件/动态库路径申请管理员权限设置安装过程界面的图标和图片C程序依赖运行库 介绍 Inno Setup:用于打包安装程序 具体步骤 首先打开inno setup compiler 第…

Qt容器类控件——QGroupBox和QTabWidget

文章目录 QGroupBox又来点餐QTabWidget使用演示 QGroupBox 容器类控件即里面可以容纳其他的控件 QGroupBox叫做分组框,可以把其他控件放在里面作为一组 QGroupBox的存在,只是为了让界面更好看一点,并不实现实质性的功能。 当界面较复杂的时候…

鸿蒙OpenHarmony【轻量系统内核扩展组件(CPU占用率)】子系统开发

基本概念 CPU(中央处理器,Central Processing Unit)占用率分为系统CPU占用率和任务CPU占用率。 系统CPU占用率:是指周期时间内系统的CPU占用率,用于表示系统一段时间内的闲忙程度,也表示CPU的负载情况。系…

小米,B站网络安全岗位笔试题目+答案

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

零拷贝技术在现代编程语言和中间件中的应用

零拷贝技术不仅存在于操作系统层面,很多现代编程语言和中间件也支持这种技术,从而提升数据传输和处理的效率。在这篇文章中,我们将深入探讨如何在流行的编程语言(如Java和Python)以及常用中间件(如Kafka和N…

LeetCode[中等]

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 思路: 计算链表长度num,num - n就是需要删去结点的索引 其中若删去第一个结点,返回head.next; /*** Definition for singly-linked list.* public …