【进程】利用 Linux 下的 /proc/pid/ 的内容学习进程

news2025/7/21 6:26:24

1. 进程号

  1. 在计算机中,每一个进程都有一个进程号,进程号类似于一个索引,操作系统就是通过这个进程号快速地找到进程。在 linux 使用 ps -aux 查看进程,可以看到进程号pid
root@swd-Lenovo-G40-80:/proc/4234# ps -aux | more
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1 225368  9136 ?        Ss   10月29   0:02 /sbin/init splash
root         2  0.0  0.0      0     0 ?        S    10月29   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        I<   10月29   0:00 [rcu_gp]
root         4  0.0  0.0      0     0 ?        I<   10月29   0:00 [rcu_par_gp]
root         6  0.0  0.0      0     0 ?        I<   10月29   0:00 [kworker/0:0H-kb]
root         8  0.0  0.0      0     0 ?        I<   10月29   0:00 [mm_percpu_wq]
root         9  0.0  0.0      0     0 ?        S    10月29   0:00 [ksoftirqd/0]
root        10  0.0  0.0      0     0 ?        I    10月29   0:06 [rcu_sched]
root        11  0.0  0.0      0     0 ?        S    10月29   0:00 [migration/0]
root        12  0.0  0.0      0     0 ?        S    10月29   0:00 [idle_inject/0]
root        14  0.0  0.0      0     0 ?        S    10月29   0:00 [cpuhp/0]
root        15  0.0  0.0      0     0 ?        S    10月29   0:00 [cpuhp/1]
root        16  0.0  0.0      0     0 ?        S    10月29   0:00 [idle_inject/1]
....
root       138  0.0  0.0      0     0 ?        S    10月29   0:00 [oom_reaper]
  1. 在上面 1中获取到的进程号,我们就可以去 /proc 中查看进程的具体信息,在 /proc 中每一个数字,就是对应的一个进程的 pid,进入到进程对应的 pid 的进程的文件夹,里面就可以看到进程的具体信息:
root@swd-Lenovo-G40-80:/proc# ls
1     1176  1285  1354  1456  1736  201   28    3479  3708  397   47   8    889  93         cgroups      irq          mtrr           thread-self
10    119   1299  1359  1471  18    21    29    3495  3739  4     543  800  89   933        cmdline      kallsyms     net            timer_list
101   12    1300  1360  1474  187   22    295   35    3750  40    575  802  892  94         consoles     kcore        pagetypeinfo   tty
102   1202  1304  1369  1496  188   223   296   351   38    4000  591  805  9    95         cpuinfo      keys         partitions     uptime
104   1219  1311  137   15    189   226   299   3510  3802  4002  592  806  90   96         crypto       key-users    pressure       version

2. 建立demo 来分析进程

  • 创建一个 demo:
// filename: pmaps1.c
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char *pStr;
    pStr = (char *)malloc(2);
    while (1);		// 死循环
    return 0;
}
  1. 编译:gcc -o pmaps1 pmaps.c
  2. 运行:./pmaps1
  3. 查看进程的 pid(pid 为 4345):``
root@swd-Lenovo-G40-80:/proc# ps -aux | grep pmaps1
swd       4345  100  0.0   4516   808 pts/3    R+   22:34   4:43 ./pmaps1
  1. 进入 /proc/4345cd /proc/4345
  2. 查看该进程的信息:
root@swd-Lenovo-G40-80:/proc/4345# ls
arch_status  clear_refs       cwd      gid_map    maps        net        oom_score_adj  root       smaps         status         uid_map
attr         cmdline          environ  io         mem         ns         pagemap        sched      smaps_rollup  syscall        wchan
autogroup    comm             exe      limits     mountinfo   numa_maps  patch_state    schedstat  stack         task
auxv         coredump_filter  fd       loginuid   mounts      oom_adj    personality    sessionid  stat          timers
cgroup       cpuset           fdinfo   map_files  mountstats  oom_score  projid_map     setgroups  statm         timerslack_ns

可以看到,能够获取到的信息挺多的!具体需要什么信息,就去查找,下面说几个常用的。

3. 几个常用的进程信息

  1. 打开的文件描述符,可以看到,进程打开的文件描述符,其中 99是因为这个进程我是在 vscode 中远程执行的,所以它有一个指向 vscode的文件描述符,0, 1, 2 是进程的标准输入输出,指向设备文件/dev/pts/3
root@swd-Lenovo-G40-80:/proc/4345# cd fd
root@swd-Lenovo-G40-80:/proc/4345/fd# ls
0  1  19  2  20  21  22  23  99

root@swd-Lenovo-G40-80:/proc/4345/fd# ll
total 0
dr-x------ 2 swd swd  0 1031 22:40 ./
dr-xr-xr-x 9 swd swd  0 1031 22:34 ../
lrwx------ 1 swd swd 64 1031 22:47 0 -> /dev/pts/3
lrwx------ 1 swd swd 64 1031 22:47 1 -> /dev/pts/3
l-wx------ 1 swd swd 64 1031 22:47 19 -> /home/swd/.vscode-server/data/logs/20231031T213437/remoteagent.log
lrwx------ 1 swd swd 64 1031 22:47 2 -> /dev/pts/3
l-wx------ 1 swd swd 64 1031 22:47 20 -> /home/swd/.vscode-server/data/logs/20231031T213437/ptyhost.log
lrwx------ 1 swd swd 64 1031 22:47 21 -> /dev/ptmx
lrwx------ 1 swd swd 64 1031 22:47 22 -> /dev/ptmx
lrwx------ 1 swd swd 64 1031 22:47 23 -> /dev/ptmx
l-wx------ 1 swd swd 64 1031 22:47 99 -> /home/swd/.vscode-server/bin/da76f93349a72022ca4670c1b84860304616aaa2/vscode-remote-lock.swd.da76f93349a72022ca4670c1b84860304616aaa2

这个查看文件描述符有什么用呢?可以用来检查进程的文件描述符有没有被释放,这个很重要,我之前在公司做开发,使用了一个开源代码,就通过查看该进程的 /proc/pid/fd 文件夹发现文件描述符泄露。

  1. 虚拟内存分布(通过/proc/pid/maps查看)
    这个也很常见,在面试 C/C++ 岗位的时候,经常会被问到,进程的内存布局。首先这个内存指的是虚拟内存。然后一般会回答主要有几个,当然除了这几个还有一些提的比较少的。而这些在/proc/pid/maps均能够看到:
    a. 堆区
    b. 栈区
    c. 数据段(静态、全局)
    d. 代码段(存放程序编译后的二进制代码)
    在这里插入图片描述
    /proc/pid/maps可以看到(在下面有解释):
root@swd-Lenovo-G40-80:/proc/4345# cat maps 
55d7d356d000-55d7d356e000 r-xp 00000000 08:02 17040544                   /home/swd/pros/c--learn/0.test_codes/demos/pmaps1
55d7d376d000-55d7d376e000 r--p 00000000 08:02 17040544                   /home/swd/pros/c--learn/0.test_codes/demos/pmaps1
55d7d376e000-55d7d376f000 rw-p 00001000 08:02 17040544                   /home/swd/pros/c--learn/0.test_codes/demos/pmaps1
55d7d404c000-55d7d406d000 rw-p 00000000 00:00 0                          [heap]
7f3f9f80f000-7f3f9f9f6000 r-xp 00000000 08:02 5505107                    /lib/x86_64-linux-gnu/libc-2.27.so
7f3f9f9f6000-7f3f9fbf6000 ---p 001e7000 08:02 5505107                    /lib/x86_64-linux-gnu/libc-2.27.so
7f3f9fbf6000-7f3f9fbfa000 r--p 001e7000 08:02 5505107                    /lib/x86_64-linux-gnu/libc-2.27.so
7f3f9fbfa000-7f3f9fbfc000 rw-p 001eb000 08:02 5505107                    /lib/x86_64-linux-gnu/libc-2.27.so
7f3f9fbfc000-7f3f9fc00000 rw-p 00000000 00:00 0 
7f3f9fc00000-7f3f9fc29000 r-xp 00000000 08:02 5505040                    /lib/x86_64-linux-gnu/ld-2.27.so
7f3f9fe12000-7f3f9fe14000 rw-p 00000000 00:00 0 
7f3f9fe29000-7f3f9fe2a000 r--p 00029000 08:02 5505040                    /lib/x86_64-linux-gnu/ld-2.27.so
7f3f9fe2a000-7f3f9fe2b000 rw-p 0002a000 08:02 5505040                    /lib/x86_64-linux-gnu/ld-2.27.so
7f3f9fe2b000-7f3f9fe2c000 rw-p 00000000 00:00 0 
7ffe5b0db000-7ffe5b0fc000 rw-p 00000000 00:00 0                          [stack]
7ffe5b125000-7ffe5b128000 r--p 00000000 00:00 0                          [vvar]
7ffe5b128000-7ffe5b12a000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0                  [vsyscall]
  • 这个是 64 位机器,所以地址会显得比较大
  • 每一列的含义:
第一列:本段在虚拟内存中的地址范围。
第二列:本段的权限。
第三列:偏移地址,即指本段映射地址在文件中的偏移。
第四列:主设备号与次设备号。
第五列:文件索引节点号。
第六列:映射的文件名。

a. 第一行: 权限是只读,并且可执行,是进程的代码段

55d7d356d000-55d7d356e000 r-xp 00000000 08:02 17040544                   /home/swd/pros/c--learn/0.test_codes/demos/pmaps1

b. 第三行:权限是可读可写,但是没有执行权限,是进程的数据段

55d7d376e000-55d7d376f000 rw-p 00001000 08:02 17040544                   /home/swd/pros/c--learn/0.test_codes/demos/pmaps1

c. 第四行:带有 [heap] 字样,说明是堆

55d7d404c000-55d7d406d000 rw-p 00000000 00:00 0                          [heap]

d. 倒数第四行:带有 [stack] 字样,说明是栈

7ffe5b0db000-7ffe5b0fc000 rw-p 00000000 00:00 0                          [stack]
  • 上面就说完了面试的内存布局了。那还剩下的是什么呢?
    i. ld-2.27共享库在 maps 的记录,每个共享库对应着3~4行,对应着数据段和代码段,主要是新的编译器对应的出来更加细分的段,有一些含义我也不清楚。
7f3f9f80f000-7f3f9f9f6000 r-xp 00000000 08:02 5505107                    /lib/x86_64-linux-gnu/libc-2.27.so
7f3f9f9f6000-7f3f9fbf6000 ---p 001e7000 08:02 5505107                    /lib/x86_64-linux-gnu/libc-2.27.so
7f3f9fbf6000-7f3f9fbfa000 r--p 001e7000 08:02 5505107                    /lib/x86_64-linux-gnu/libc-2.27.so
7f3f9fbfa000-7f3f9fbfc000 rw-p 001eb000 08:02 5505107                    /lib/x86_64-linux-gnu/libc-2.27.so
7f3f9fbfc000-7f3f9fc00000 rw-p 00000000 00:00 0
7f3f9fc00000-7f3f9fc29000 r-xp 00000000 08:02 5505040                    /lib/x86_64-linux-gnu/ld-2.27.so
7f3f9fe12000-7f3f9fe14000 rw-p 00000000 00:00 0 
7f3f9fe29000-7f3f9fe2a000 r--p 00029000 08:02 5505040                    /lib/x86_64-linux-gnu/ld-2.27.so
7f3f9fe2a000-7f3f9fe2b000 rw-p 0002a000 08:02 5505040                    /lib/x86_64-linux-gnu/ld-2.27.so

ii. 下面的段我现在也不认识

7ffe5b125000-7ffe5b128000 r--p 00000000 00:00 0                          [vvar]
7ffe5b128000-7ffe5b12a000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0                  [vsyscall]

好了,介绍完了这个 maps 的文件后,那这个文件有什么用呢?
作用可多了,对一些进程进行内存优化,先看这个文件:

  1. 先看堆区是否太大,在 malloc/new 的时候有没有开辟的太多内存
  2. 看栈区的大小,如果太大,看能不能合理调整结构体,栈变量有没有冗余。

看内存是否泄露:
3. 看进程的业务已经稳定了,观察堆区的大小是否在变大。变大就应该怀疑内存有泄露。

上面看地址的范围,很难计算出各个段占用内存的大小。那么还有一个文件可以看到占用的大小:

cat /proc/pid/smaps

4. 待定,这个/proc/pid 文件夹内还有很多有用的进程的信息,有空来补

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

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

相关文章

建站起步-如何选择域名

如何选择合适的域名 如何选择合适的域名 我们所看到的网站是由域名加空间服务器加网站程序组成的,往往我们用户最先看到的就是网站的域名,因为网站内容加载往往需要时间,所以最先展示的就是我们网站的域名了。域名就跟我们手机号一样具有唯一性,当我们没有及时续费时,就…

LibTorch实战三:C++版本YOLOV5.4的部署

目录 一、环境配置 二、.torchscript.pt版本模型导出 三、C版本yolov5.4实现 四、问题记录 4.1、注释 detector.h中&#xff0c;注释如下头文件 4.2、错误&#xff1a; “std”: 不明确的符号 4.3、建议常被debug版本libtorch 4.4、问题&#xff1a;编译成功后&#xff…

信息系统项目管理师教程 第四版【第10章-项目进度管理-思维导图】

信息系统项目管理师教程 第四版【第10章-项目进度管理-思维导图】 课本里章节里所有蓝色字体的思维导图

Ardupilot开源飞控之Wiki修改操作

Ardupilot开源飞控之Wiki修改操作 1. 源由2. 页面编辑修改2.1 Step 1: 申请Github账号2.2 Step 2: 选择修改页面2.3 Step 3: 修改页面内容2.4 Step 4: 提交修改2.5 Step 5: 新增PR 3. 增删页面修改3.1 Step 1: 克隆本地的Ardupilot Wiki3.2 Step 2: 搭建本地验证环境3.3 Step 3…

【Android知识笔记】换肤专题

换肤其实也属于插件化专题的一个子话题,之所以单独拿出来,是因为它的处理方式比较特殊,相比插件化而言较简单一些。 系统内置的换肤功能支持 - Theme Android 系统中如果想修改应用的背景色,最简单的就是利用以下Theme相关的属性: 使用这些内置的属性可以实现一定程度上…

SAP-MM-查找物料修改记录

业务场景&#xff1a; 仓管员修改了物料描述&#xff0c;研发部想要查哪些被修改了&#xff0c; 底表:CDHDR、CHPOS 首先在底表CDHDR中查找用户名的操作记录&#xff0c; 输入修改代码、时间范围、用户名 执行&#xff0c;生产数据 导出数据&#xff0c;复制文档编号&#…

身份证OCR:变革的触手,掀起识别的革命

身份证OCR识别技术&#xff08;Optical Character Recognition&#xff09;是一项将身份证上的文字信息转化为可编辑、搜索、存储、分享的电子文本的技术。它的发展与信息技术和身份认证需求的不断演进密切相关。以下将简要介绍身份证OCR识别技术的历史以及兴起背景。 OCR识别…

Windows个性化颜色睡眠后经常改变

问题再现 我把系统颜色换成了一种红色&#xff0c;结果每次再打开电脑又变回去了&#xff08;绿色&#xff09;&#xff1b; 原因是因为wallpaper engine在捣蛋 需要禁用修改windows配色这一块选项&#xff1b; 完事&#xff01;原来是wallpaper engine的问题&#xff1b;

什么是Webpack的loader和plugin?它们的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

这个电力问题难倒90%的人,但我只用一招就搞定!

随着现代社会对电力需求的不断增加&#xff0c;配电系统的可靠性和安全性变得至关重要。为了确保电力系统的稳定运行&#xff0c;配电柜监控系统应运而生。 配电柜监控系统通过实时监测和控制电力分配&#xff0c;提供了对电力系统状态的详细洞察&#xff0c;以帮助运维人员及时…

不同阶段品牌的种草策略是什么,小红书打法分析!

不同阶段的品牌在制定营销目标&#xff0c;规划营销策略&#xff0c;执行营销方案时的操作&#xff0c;也有所不同。所以&#xff0c;今天我们以品牌的发展阶段为基准&#xff0c;与大家探讨一下&#xff0c;不同阶段品牌的种草策略是什么&#xff0c;小红书打法分析&#xff0…

[UDS] --- TesterPresent 0x3E

1 0x3E功能描述 这个服务的目的是确保诊断服务或者之前激活的通信还处在激活的状态&#xff0c;可以保持当前的非默认&#xff08;Default Session&#xff09;会话&#xff0c;通过周期地发送请求帧来阻止自动跳转回默认&#xff08;Default Session&#xff09;会话。 2 0x…

写博客的模板

本人详解 作者&#xff1a;王文峰&#xff0c;参加过 CSDN 2020年度博客之星&#xff0c;《Java王大师王天师》作者 公众号&#xff1a;山峯草堂&#xff0c;非技术多篇文章&#xff0c;专注于天道酬勤的 Java 开发问题、中国国学、传统文化和代码爱好者的程序人生&#xff0c;…

Scan2BIM实战:从3D扫描到BIM模型生成

最近&#xff0c;我被问过很多次这个问题&#xff0c;所以我想我会尽力传达答案。 我应该指出&#xff0c;以下是概述&#xff0c;而不是非常详细的分步过程。 有很多因素会决定这项工作&#xff1b; 详细程度、扫描设备、点云配准软件和 CAD 软件等。 由于不知道你可能拥有或感…

电池内阻仪原理分析

前言 整理电脑看到一个名为“内阻仪”的文档&#xff0c;打开看了一下&#xff0c;记录一下&#xff1b; 前置知识 测内阻就是测电阻&#xff0c;核心原理&#xff1a;RU/I&#xff1b; U&#xff1a;这里面是交流激励信号&#xff1b; I&#xff1a;这里是恒流激励 电路与…

redirect_uri 参数错误

当微信登陆报redirect_uri 参数错误&#xff0c;网上很多人说是域名配置有问题&#xff0c;我在检查过后没发现这个有什么问题&#xff0c;然后我在redirect_uri的授权回调域 前面加上https://就好了 appid"appid" :scope"snsapi_login" :theme&quo…

YNS2582 同步升压双节锂电池充电管理 IC

YNS2582 同步升压双节锂电池充电管理 IC 简述&#xff1a; NS2582 是一款支持输入电压 4-5.5VIN&#xff0c;输出最大 2A 电流的同步升压式双节锂电池充电器。其集成了极低的导通电阻 FETs&#xff0c;以实现较高的充电效率和极少数外围器件。NS2582 内置了 1.2MHz 开关频率和…

外汇天眼:10月客诉前十榜单出炉,差评不断所谓何因?

纵观整个10月的天眼客诉排行榜&#xff0c;可以发现此次名单基本上都是无监管、成立时间短的“新”外汇平台&#xff0c;其中无法出金依旧仍是客诉的关键来源&#xff01; 接下来&#xff0c;就跟着天眼君一起来看看是哪些“新”平台上榜天眼客诉榜&#xff01; 具体客诉排行榜…

【tensorboard打开失败】No dashboards are active for the current data set.

这里我再跟视频学的时候&#xff0c;找了很多的指令&#xff0c;说是对应版本不一样&#xff0c;但是发现用了很多指令都可以弹出来跳转的url&#xff0c;那应该就不是输入指令的问题 直到我想把logs里面的文件删掉重新跑的时候&#xff0c;我突然注意到这里有中文字符&#xf…

【虹科分享】Domo可视化——一份硬核的国庆出游攻略

国庆黄金周&#xff0c;正是游览祖国大好河山的好时机。然而&#xff0c;众所周知&#xff0c;“当灿烂的太阳跳出东海的碧波&#xff0c;帕米尔高原依然是群星闪烁&#xff1b;当北国还是银装素裹的世界&#xff0c;南疆早已洋溢着盎然的春色。”面对如此广阔的大地&#xff0…