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!)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值