本文章主要是介绍如何获取系统和进程的相关信息, 其实本文的内容, 几乎在开发的时候很少使用的到, 我也会结合自己的使用场景介绍一些例子, 如果大家看完之后觉得确实在日常开发中用处不大, 也实属正常./proc文件系统
为了更便捷地访问内核信息,Linux操作系统提供了 /proc虚拟文件系统。该文件系统位于 /proc 目录下,包含许多能暴露内核信息的文件,使进程可以通过常规的文件I/O系统调用来方便地读取这些信息,并在某些情况下修改它们。/proc文件系统之所以被称为“虚拟”,是因为其中包含的文件和子目录并不实际存储于磁盘上,而是由内核在进程访问时动态创建。 为什么需要知道进程相关的信息呢? 假设你现在是一个系统的维护者, 在不修改代码的前提下, 如何查看项目进程的运行状态呢? 或者如何查看一下, 操作系统里面当前有多少个进程在运行呢? 这里该文件系统就起作用了. 里面每一个数字命名的文件名称代表的就是一个进程IDls /proc1 15 26 2860815 340 45 56 68 720
获取一个进程的信息/proc/PID
作为系统的开发者, 可以通过ps命令来获取运行中项目的进程ID(PID), 这样就可以在/proc/PID目录下获取到进程的相关信息. 这样就可以以系统维护者的角色, 在不关心实际进程代码的前提下, 获取到进程相关的信息了. 系统内核会为每个进程提供一个对应的 /proc/PID 目录,其中 PID 是进程的ID。该目录包含各种文件和子目录,用于记录该进程的相关信息。其中包含该进程的详细信息,如命令行参数、环境变量、打开的文件、内存映射等。这对于调试和监控进程非常有用. 例如,我们可以通过查看 /proc/2794390 目录下的文件来获取始终以进程ID 2794390运行的 init进程的信息。该进程的名称为“inf.platform.st”(给名称被截断了), 使用的文件模式创建掩码为0002, 用于控制进程创建新文件或目录时的默认权限, 它通过“屏蔽”掉特定的权限位来工作。cat status Name: inf.platform.stUmask: 0002State: S (sleeping)Tgid: 2794390Ngid: 0Pid: 2794390PPid: 2794382TracerPid: 0Uid: 1000 1000 1000 1000Gid: 1000 1000 1000 1000FDSize: 64Groups: 27 1000 NStgid: 2794390NSpid: 2794390NSpgid: 2794382NSsid: 2792408Kthread: 0VmPeak: 1916976 kBVmSize: 1851740 kBVmLck: 0 kBVmPin: 0 kBVmHWM: 40524 kBVmRSS: 38520 kBRssAnon: 19576 kBRssFile: 18944 kBRssShmem: 0 kBVmData: 125612 kBVmStk: 132 kBVmExe: 17196 kBVmLib: 2208 kBVmPTE: 280 kBVmSwap: 0 kB
这个信息的使用场景比较有限, 一方面是因为这个/proc文件系统是Linux操作系统特有的, 不具备可移植性, 但是它依旧有其价值所在. 例如可以查看进程的属性, 包括信号的掩码, 创建文件的掩码等, 就知道程序创建相关文件和信号屏蔽的逻辑了. 另外该文件夹下面, 还有一些文件记录了进程相关的信息, 如下图, 其中文件夹fd的软链接就是对应打开的文件描述符, 往对应的文件描述符写入数据, 是可以被对应的进程感知到的.系统信息
当我们申请一台服务器之后, 最先做的就是看下操作系统的发行版本, 这样才知道应该用什么命令行来处理一些不兼容的场景, 除了使用系统调用uname之外, 还可以使用命令行uname来现实. 如下, 该操作系统为Linux, 发行版本为Ubuntu.uname -aLinux iv-ydts0uqvi85i3z33xed2 6.8.0-36-generic #36-Ubuntu SMP PREEMPT_DYNAMIC Mon Jun 10 10:49:14 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux