修改自: http://www.linux.com/feature/126718
/proc 在 Linux 中是一个比较奇妙的目录,保存了当前系统所有的详细信息,包括进程、文件系统、硬件…… 而且还可以通过 /proc 来即时修改系统中的某些参数。
你可能会认为,“文件”指的就是硬盘上保存的数据,要么是文本,要么就是二进制文件。而在 Linux 的世界中,所有的东西都可以通过文件来表示和管理,哪怕是硬件设备,也可以通过 /dev 下的设备文件来操作硬件设备。
/proc 就是这样一种文件,它并不存在于硬盘上,每当系统启动的时候,操作系统自动创建 /proc 下的内容,你可以查看这些文件的列表,但是你会发现大部分文件的大小都是 0 ,这并不奇怪,因为这些文件属于“virtual files“,也就是说,当你读取这些文件的时候,系统内核为你即时生成文件中的内容。
/proc 下的信息包括了有关硬件、进程、系统的详细信息,先看看 /proc 下大致都有啥吧:
可以看到,除了一些文件之外,更多的是一堆以数字为名称的目录,每个目录代表了系统中的一个进程,目录下是有关这个进程的详细信息,这个等下我们再说。 /proc 下还有一个 self 文件,实际上是一个连接,指向了当前运行中的进程目录。
首先我们看看 /proc 目录下一些非常有用的文件,查看这些文件的内容很简单,用 cat 命令就可以了~
/proc/cpuinfo 即是当前系统 cpu 的详细信息,从型号到支持的特性,如果你是多核 cpu 的话,会看到多个这样的输出。检测 cpu 的程序,也是通过 /proc/cpuinfo 来得到当前 cpu 的详细信息的。
/proc/meminfo 是当前系统内存的详细信息,当然,随着系统的运行,这些信息也会随时变化。像 top、free 这些可以查看当前系统内存信息的程序,就是通过读取 /proc/meminfo 来实现的。
/proc/version 是当前系统的版本信息,uname 这个命令,就是通过它来得到内核版本和系统版本的。
/proc/filesystems 为当前系统支持的文件系统列表,你可以在程序中读取这个文件,以获得当前系统对文件系统的支持信息。
上面这几个只是比较常用的,实际上 /proc 下的信息相当丰富,很多文件都可以 cat 一下看看,比如:
* /proc/apm: APM 高级电源管理信息。
* /proc/acpi: 目录下为 ACPI 的详细信息。 比方说, 你想知道你的笔记本电脑是否连接了电源, 你可以 cat /proc/acpi/ac_adapter/AC/state 看看结果是 "on line" 还是 "off line" 。
* /proc/cmdline: 显示内核的启动参数,一般就是你 grub 中传入内核的那些参数,比如我的就是: root=/dev/sda9 video=uvesafb:1680x1050-32,mtrr:3,ywrap
* /proc/loadav: 显示系统的负载,w、top 这类程序也是从此得到系统负载信息。
* /proc/uptime: 系统自启动来所经历的秒数,uptime 程序就是从此计算出系统启动后经历的时间的。
* /proc/devices: 系统中所有可用的字符和块设备。
* /proc/ioports: IO 端口信息。
* /proc/dma: 当前可用的 DMA 通道。
* /proc/mounts: 系统当前的挂载信息。
除此之外,还有一些文件和硬件相关,比如 /proc/interrupts 为终端信息,/proc/irq 为 IRQ 信息,还有 /proc/pci、/proc/bus 等等。
现在我们来看看开始提到的那些数字目录,也就是和进程相关的目录。
如前面所说,每个数字目录都代表了一个正在运行的进程,目录的数字名就是进程的 ID,每当一个新进程启动,一个新的目录就会被创建,同理进程结束的时候,相应的目录也会消失。
让我们看看进程目录下面都有啥:
随便挑选了一个名称为 11108 的目录,在我的机子上对应的进程是 firefox-bin,让我们看看目录下这些文件都是啥:
* cmdline: 启动进程的命令和参数。
* cwd: 指向进程当前目录的一个连接。
* environ: 进程所有的环境变量。
* fd: 进程所有打开的文件描述符,目录下是一个个以数字为名称的连接,指向了进程当前正在使用的文件。
* maps, statm, mem: 进程的内存信息。
* stat, status: 进程的状态信息,比如查看 /proc/status 中是否含有 “Zombie”字样,来查看僵尸进程。
/proc/sys
/proc/sys 目录下不仅提供了系统某些设置信息,你还可以修改这些文件来在运行中改变系统的参数,比如,你想让别人 ping 不到你,只要:
这样就可以让系统忽略所有的 ICMP 回应,别人就 ping 不到你了。
/proc/sys 下的可配置的选项很多,主要有 6 类: debug、dev、fs、kernel、net、vm,只要文件属性是可读写的,一般都对应了系统某个可以修改的参数。
不过系统重启之后参数就恢复默认值了,其实有专门的工具来修改这些参数,那就是 sysctl 和 /etc/sysctl.conf 这个配置文件,不过这不是本文的内容,感兴趣的就去搜一下吧~
如上所述,/proc 是一个强大的特殊目录,其中的文件提供了非常详细的系统信息,很多常用的程序就是从此得到系统各个方面的信息的,在你写的程序和脚本中,也可以通过 /proc 方便的获得一些系统参数,甚至修改系统的某些参数,本文只是 /proc 的一个简要的介绍,更详细的内容留给各位自己去探索吧~
is-Programmer 是一个面向 Linux 爱好者与程序员的 Blog 系统,具有简洁的风格,方便的代码高亮和数学公式插入功能,适合撰写学习笔记和技术文档。
Host by is-Programmer.com | Power by Chito 1.3.3 beta
2008年2月16日 09:12 呵呵,今天我也看见linux.com上这篇文章了……
2008年2月16日 09:41 嘿嘿,觉得不错,就翻译过来了~
2008年2月16日 14:11 是很有用,我以前只用他控制转发什么的。
2008年2月16日 18:35 /proc/acpi 似乎将要被 /sys/class 取代。
2008年2月16日 19:49 我一直认为/proc系统是极其伟大的设计~
2008年2月16日 22:49 同意~
2008年2月23日 23:59 还是Linux好啊,在Win下要想获得这些信息,之能在程序源代码中调用一大堆复杂的API才行