linux / proc
一、概述
Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。
用户和应用程序可以通过 proc 得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取 proc 文件时,proc 文件系统是动态从系统内核读出所需信息并提交的。下面列出的这些文件或子文件夹,并不是都是在你的系统中存在,这取决于你的内核配置和装载的模块。另外,在 /proc 下还有三个很重要的目录:net,scsi 和 sys。 Sys目录是可写的,可以通过它来访问或修改内核的参数,而 net 和 scsi 则依赖于内核配置。例如,如果系统不支持 scsi,则 scsi 目录不存在。
除了以上介绍的这些,还有的是一些以数字命名的目录,它们是进程目录。系统中当前运行的每一个进程都有对应的一个目录在 /proc 下,以进程的 PID 号为目录名,它们是读取进程信息的接口。而 self 目录则是读取进程本身的信息接口,是一个 link。
二、功能说明
下面对整个 /proc 目录作一个大略的介绍。
1、[number]
在 /proc 目录里, 每个正在运行的进程都有一个以该进程 ID 命名的子目录,其下包括如下的目录和伪文件:
(1)[number] / cmdline
该文件保存了进程的完整命令行。如果该进程已经被交换出内存,或者该进程已经僵死,那么就没有任何东西在该文件里,这时候对该文件的读操作将返回零个字符。该文件以空字符 null 而不是换行符作为结束标志。
(2)[number] / cwd
一个符号连接,指向进程当前的工作目录。例如,要找出进程 20 的 cwd,你可以:
cd /proc/20/cwd
/bin/pwd
请注意 pwd 命令通常是 shell 内置的,在这样的情况下可能工作得不是很好(casper 注: pwd 只能显示 /proc/20/cwd, 要是想知道它的工作目录,直接 ls -al /proc/20 不就好了)。
(2)[number] / environ
该文件保存进程的环境变量,各项之间以空字符分隔,结尾也可能是一个空字符。因此,如果要输出进程 1 的环境变量,你应该:
(cat /proc/1/environ; echo) | tr "\000" "\n"
(至于为什么想要这么做,请参阅 lilo(8).)
(3)[number] / exe
也是一个符号连接,指向被执行的二进制代码。在 Linux 2.0 或者更早的版本下,对 exe 特殊文件的 readlink(2) 返回一个如下格式的字符串:[设备号] : 节点号
举个例子,[0301] : 1502 就是某设备的 1502 节点,该设备的主设备号为 0 (如 IDE,MFM 等驱动器),从设备号为 01(第一个驱动器的第一分区)。 而在 Linux 2.2 下,readlink(2) 则给出命令的实际路径名。另外,该符号连接也可以正常析引用(试图打开 exe 文件实际上将打开一个可执行文件)。你甚至可以键入 /proc/[number]/exe 来运行 [number] 进程的副本,带 -inum 选项的 find(1) 命令可以定位该文件。
(4)[number] / fd
进程所打开的每个文件都有一个符号连接在该子目录里,以文件描述符命名,这个名字实际上是指向真正的文件的符号连接,(和 exe 记录一样)。例如,0 是标准输入,1 是标准输出,2 是标准错误等等。程序有时可能想要读取一个文件却不想要标准输入,或者想写到一个文件却不想将输出送到标准输出去,那么就可以很有效地用如下的办法骗过(假定 -i 是输入文件的标志,而 -o 是输出文件的标志):
foobar -i /proc/self/fd/0 -o /proc/self/fd/1
这样就是一个能运转的过滤器。请注意该方法不能用来在文件里搜索,这是因为 fd 目录里的文件是不可搜索的。在 UNIX 类的系统下,/proc/self/fd/N 基本上就与 /dev/fd/N 相同。实际上,大多数的 Linux MAKEDEV 脚本都将 /dev/fd 符号连接到 [..]/proc/self/fd 上。
(5)[number] / attr
进程的属性。
(6)[number] / limits
该文件存储了进程的软限制,硬限制等信息。 可以查看该进程允许打开的最大描述字个数。
(7)[number] / maps
列名称如下:
address perms offset dev inode pathname
栗子:
4001f000-40135000 r-xp 00000000 03:0c 45494 /lib/libc-2.2.4.so
- address:进程占用的地址空间。
- perms:权限集,r = read,w = write,x = execute,s = shared,p = private (copy on write)
- offset:文件偏移量。
- dev:为设备(major:minor)
- inode:设备上的inode。0为没有inode关联互内存区域,通常为:BSS(uninitialized data)
(8)[number] / root
指向进程更目录的软连接。
(9)[number] / smaps
(SAW:Game Over!)