/proc文件系统

来源:互联网 发布:java final成员变量 编辑:程序博客网 时间:2024/05/01 20:16

/proc文件系统

为了提供更为简便的方法来访问内核信息,许多现代UNIX实现了一个/proc虚拟文件系统。该文件系统驻留于/proc目录中,包含了各种用于展示内核信息的文件,并且允许进程通过常规文件I/O系统调用来方便地读取。之所以将/proc系统称为虚拟,是因为其包含的文件和子目录并未存储于磁盘上,而是由内核在进程访问此类信息时动态创建而成。

获取与进程相关的信息

/proc/pid
对于系统中每个进程,内核都提供了相应的目录,命名为/proc/pid,其中PID是进程的ID。在此目录中的各种文件和子目录包含了进程相关的信息。
如通过查看/proc/1/目录下的文件。可以获取init进程的信息,该进程的ID总为1,每个/proc/pid目录中都有一个命名为status的文件,提供了有关该进程的一系列信息。
[root@localhost ~]# cat /proc/1/status
Name:   systemd                         进程名
State:  S (sleeping)                    进程状态
Tgid:   1                               线程组ID(传统的进程PID,getpid()返回的就是这个)
Pid:    1                               线程ID(gettid())
PPid:   0                               父进程ID
TracerPid:      0                       跟踪进程的PID(0表示没有跟踪)
Uid:    0       0       0       0       
Gid:    0       0       0       0
FDSize: 256                             当前分配的文件描述符插槽
Groups:                                 补充组ID
VmPeak:     6508 kB                     峰值虚拟内存大小
VmSize:     6472 kB                     当前虚拟内存大小
VmLck:         0 kB                     锁定内存
VmPin:         0 kB                     
VmHWM:      3648 kB                     峰值驻留集大小
VmRSS:      3648 kB                     当前驻留集大小
VmData:     1556 kB                     数据段大小
VmStk:       136 kB                     栈大小
VmExe:       896 kB                     可执行代码大小
VmLib:      3652 kB                     共享lib代码大小
VmPTE:        20 kB                     页表大小
VmSwap:        0 kB
Threads:        1                       
SigQ:   1/4684                          当前/最大 队列信号
SigPnd: 0000000000000000                线程挂起信号
ShdPnd: 0000000000000000                进程挂起信号
SigBlk: 7be3c0fe28014a03                阻塞信号
SigIgn: 0000000000001000                忽略信号
SigCgt: 00000001800004ec                捕获信号
CapInh: 0000000000000000                可继承能力
CapPrm: ffffffffffffffff                允许能力
CapEff: ffffffffffffffff                有效能力
CapBnd: ffffffffffffffff                能力边界集
Cpus_allowed:   1                       CPU允许掩码
Cpus_allowed_list:      0               和上面的一样,链表形式
Mems_allowed:   1                       内存节点允许掩码
Mems_allowed_list:      0               和上面一样,链表形式
voluntary_ctxt_switches:        1274    主动上下文切换
nonvoluntary_ctxt_switches:     2609    被迫上下文切换

每个/proc/PID目录下的文件节选
cmdline           以\0分隔的命令行参数
cwd               执行当前工作目录的符号链接
environ           NAME=value键值对环境列表
exe               指向正在执行的符号链接
fd                文件目录,包含了指向由进程打开文件的符号链接,每个符号链接的名称都与描述符相匹配
maps              内存映射
mem               进程虚拟内存
mounts            进程的安装点
root              指向根目录的符号链接
status            各种信息
task              为进程中每个线程均包含一个子目录

为了方面起见,任何进程都可以使用符号链接/proc/self/来访问其自己的/proc/pid目录
线程:/proc/pid/task目录
Linux 2.4增加了线程组的概念,正式支持POSIX线程模型。因为线程组中的一些属性对于线程而言是唯一的,所以linux2.4在/proc/pid目录下增加了一个task子目录。针对进程中的每个线程,内核提供了以/proc/pid/task/tid命名的子目录,其中TID是该线程的线程ID
每个/proc/pid/task/tid子目录中都有一套类似于/proc/pid目录内容的文件和目录。因为线程共享了多个属性,所以这些文件中的许多信息对进程中各个线程而言都是相同的。然而,这些文件也显示了每个线程的独特信息,故而是合理的。例如,在线程组的/proc/pid/task/tid/status文件中,存在那种对每个线程而言,内容都有可能不同的字段,state,pid,sigpnd,sigblk,capinh,capprm,capeff和capbnd就在此列

/proc目录下的系统信息

/proc              各种系统信息
/proc/net          有关网络和套接字的状态信息
/proc/sys/fs       文件系统相关的设置
/proc/sys/kernel   各种常规内核设置
/proc/sys/net      网络和套接字设置
/proc/sys/vm       内存管理设置
/proc/sysvipc      有关SystemV IPC对象信息

访问/proc/文件

1、通常使用shell脚本来访问/proc目录下的文件(使用诸如python或者perl之类的脚本语言)
2、也可以从程序中使用常规I/O系统调用来访问/proc目录下的文件。但在访问这些文件时,有如下限制:
   a、/proc目录下的一些文件时只读的
   b、/proc目录下的一些文件仅能由文件拥有者(或特权进程)读取。例如/proc/pid目录下的所有文件都属于拥有相应进程的用户
   c、/proc目录的其他文件大多属于root用户,并且也仅有root用户能够修改那些可修改的文件。



0 0
原创粉丝点击