这里主要介绍/proc伪文件系统及uname()函数来获取系统或进程的一些信息。
/proc文件系统介绍
在早期的UNIX发行版中,并不能很容易的分析内核的一些属性,并且很难回答以下问题:
系统有多少进程正在运行,并且谁拥有这些进程?
一个进程都打开了哪些文件?
哪些文件目前被锁住了,并且哪些进程拥有这些文件锁?
系统有哪些套接字正在使用?
一些早期的UNIX发行版解决该问题是允许有权限的程序进入内核的内存空间的数据结构中。这样的解决办法有诸多不便。然而,最蛋疼的是它需要程序员了解的内核中的数据结构,并且这些数据结构在不同的内核版本中会略有不同,需要程序员根据实际所依赖的内核进行代码的重写。
为了提供便捷的访问内核信息,很多现代的UNIX发行版提供了/proc虚拟文件系统。该文件系统驻留在/proc目录下,该目录下有很多文件以暴露内核信息,方便进程来从中读取信息,并在某种情形下还可以使用系统的I/O调用来修改这些信息。说/proc文件系统是虚的,主要是因为它下面的文件及子目录并不占用硬盘空间。相反是内核在进程访问这些信息的时候创建的。
获取某个进程的一些信息
对于每一个系统中进程来说,内核提供了一个在/proc中相应的目录,该目录一般是进程的PID。在/proc/PID目录中有一些文件及子目录等,这些文件及目录都包含了该进程的相关信息。在Gun/Linux系统中,我们最熟悉的1号进程就是init进程,与其相关的进程信息在/proc/1目录下。
在/proc/1目录下,有一个名为status的文件,status文件包含了关于该进程的一些详尽信息,接下来我们可以看看里面是什么东东,
[root@lavenliu ~]# cat /proc/1/status Name: init State: S (sleeping) Tgid: 1 Pid: 1 PPid: 0 TracerPid: 0 Uid: 0 0 0 0 Gid: 0 0 0 0 Utrace: 0 FDSize: 64 Groups: VmPeak: 19296 kB VmSize: 19232 kB VmLck: 0 kB VmHWM: 1588 kB VmRSS: 1588 kB VmData: 200 kB VmStk: 88 kB VmExe: 140 kB VmLib: 2348 kB VmPTE: 56 kB VmSwap: 0 kB Threads: 1 SigQ: 0/3878 SigPnd: 0000000000000000 ShdPnd: 0000000000000000 SigBlk: 0000000000000000 SigIgn: 0000000000001000 SigCgt: 00000001a0016623 CapInh: 0000000000000000 CapPrm: ffffffffffffffff CapEff: fffffffffffffeff CapBnd: ffffffffffffffff Cpus_allowed: 3 Cpus_allowed_list: 0-1 Mems_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001 Mems_allowed_list: 0 voluntary_ctxt_switches: 577 nonvoluntary_ctxt_switches: 69
下面列出/proc/PID目录下的一些其他文件,如下:
文件 | 说明 |
cmdline | 以‘\0‘结尾的命令行参数 |
cwd | 指向当前工作目录的软连接 |
environ | 环境变量列表,形如:NAME=value形式 |
exe | 执行进程可执行文件的软连接 |
fd | 该目录包含进程已打开的文件描述符,软链接至打开的文件 |
maps | 内存映射 |
mem | 进程的虚拟内存 |
mounts | 进程使用的挂载点 |
root | 软链接至根目录 |
status | 进程的一些信息(如:进程ID、内存使用情况、信号等) |
task | 该目录下是进程的线程目录,每个线程一个子目录 |
/proc/PID/fd目录介绍
未完待续。。。。,回去做饭咯。
本文出自 “固态U盘” 博客,请务必保留此出处http://lavenliu.blog.51cto.com/5060944/1783110
原文地址:http://lavenliu.blog.51cto.com/5060944/1783110