linux深入proc文件系统之pid目录(下)

proc 是一个虚拟文件系统,在Linux 系统中它被挂载于/proc 目录之上。proc 有多个功能 ,这其中包括用户可以通过它访问内核信息或用于排错,这其中一个非常有 用的功能,也是Linux 变得更加特别的功能就是以文本流的形式来访问进程信息。很Linux 命令( 比如 ps 、toPpstree 等) 都需要使用这个文件系统的信息。

maps

/proc/[pid]/maps显示进程内存区域映射信息

  1. > cat /proc/1751/maps
  2. 00400000-00401000 r-xp 00000000 fd:01 100897359 /opt/java/jdk1.8.0_231/bin/java
  3. 00600000-00601000 r--p 00000000 fd:01 100897359 /opt/java/jdk1.8.0_231/bin/java
  4. 00601000-00602000 rw-p 00001000 fd:01 100897359 /opt/java/jdk1.8.0_231/bin/java
  5. 01542000-01563000 rw-p 00000000 00:00 0 [heap]
  6. 6c7c00000-6e0100000 rw-p 00000000 00:00 0
  7. 6e0100000-76d400000 ---p 00000000 00:00 0
  8. 76d400000-797580000 rw-p 00000000 00:00 0
  9. 797580000-7c0000000 ---p 00000000 00:00 0
  10. 7c0000000-7c18a0000 rw-p 00000000 00:00 0
  11. 7c18a0000-800000000 ---p 00000000 00:00 0
  • address字段表示进程中内存映射占据的地址空间,格式为十六进制的BeginAddress-EndAddress。
  • perms字段表示权限,共四个字符,依次为rwxs或rwxp,其中r为read,w为write,x为execute,s为- -shared,p为private,对应位置没有权限时用一个短横线代替。
  • offset字段表示内存映射地址在文件中的字节偏移量。
  • dev字段表示device,格式为major:minor。
  • inode字段表示对应device的inode,0表示内存映射区域没有关联的inode,如未初始化的BSS数据段就是这种情况。
  • pathname字段用于内存映射的文件,对于ELF格式的文件来说,可以通过命令readelf -l查看ELF程序头部的Offset字段,与maps文件的offset字段作对比。pathname可能为空,表示匿名映射,这种情况下难以调试进程,如gdb、strace等命令。除了正常的文件路径之外,pathname还可能是下面的值:
  1. [stack] 初始进程(主线程)的stack
  2. [stack:<tid>] 线程IDtidstack. 对应于/proc/[pid]/task/[tid]/路径
  3. [vdso] Virtual Dynamically linked Shared Object
  4. [heap] 进程的heap

root

/proc/[pid]/root是进程根目录的符号链接

  1. > ls -al /proc/1751/root
  2. lrwxrwxrwx 1 root root 0 Jul 14 22:38 /proc/1751/root -> /

stack

/proc/[pid]/stack显示当前进程的内核调用栈信息,只有内核编译时打开了CONFIG_STACKTRACE编译选项,才会生成这个文件

  1. > cat /proc/1751/stack
  2. [<ffffffffa4112496>] futex_wait_queue_me+0xc6/0x130
  3. [<ffffffffa411323b>] futex_wait+0x17b/0x280
  4. [<ffffffffa4114fa6>] do_futex+0x106/0x5a0
  5. [<ffffffffa41154c0>] SyS_futex+0x80/0x190
  6. [<ffffffffa4793f92>] system_call_fastpath+0x25/0x2a
  7. [<ffffffffffffffff>] 0xffffffffffffffff

statm

/proc/[pid]/statm显示进程所占用内存大小的统计信息,包含七个值,度量单位是page(page大小可通过getconf PAGESIZE得到)

  1. > cat /proc/1751/statm
  2. 2507998 361498 1427 1 0 2466085 0
  • a)进程占用的总的内存;
  • b)进程当前时刻占用的物理内存;
  • c)同其它进程共享的内存;
  • d)进程的代码段;
  • e)共享库(从2.6版本起,这个值为0);
  • f)进程的堆栈;
  • g)dirty pages(从2.6版本起,这个值为0)

status

/proc/1751/status当前shell命令所在进程的信息

  1. > cat /proc/1751/status
  2. Name: java
  3. Umask: 0022
  4. State: S (sleeping)
  5. Tgid: 1751
  6. Ngid: 0
  7. Pid: 1751
  8. PPid: 1
  9. TracerPid: 0
  10. Uid: 0 0 0 0
  11. Gid: 0 0 0 0
  12. FDSize: 256
  13. Groups: 0
  14. VmPeak: 10064696 kB
  15. VmSize: 10031992 kB

syscall

/proc/1751/syscall显示当前进程正在执行的系统调用

  1. > cat /proc/1751/syscall
  2. 202 0x7fefc50279d0 0x0 0x6d8 0x0 0x0 0x7fefc5027700 0x7ffdb03f6e38 0x7fefc4c03fd7

第一个值是系统调用号(7代表poll),后面跟着6个系统调用的参数值(位于寄存器中),最后两个值依次是堆栈指针和指令计数器的值。如果当前进程虽然阻塞,但阻塞函数并不是系统调用,则系统调用号的值为-1,后面只有堆栈指针和指令计数器的值。如果进程没有阻塞,则这个文件只有一个“running”的字符串。

内核编译时打开了CONFIG_HAVE_ARCH_TRACEHOOK编译选项,才会生成这个文件。

wchan

/proc/1751/wchan显示当进程休眠时,内核当前运行的函数

  1. > cat /proc/1751/wchan
  2. futex_wait_queue_me

其它目录

  • /proc/[pid]/task,目录,每个线程一个子目录,目录名为线程ID。
  • /proc/[pid]/stat,文件,进程状态信息,用于ps命令。
  • /proc/[pid]/uid_map,文件,用户ID映射信息,详见(man user_namespaces)。
  • /proc/[pid]/gid_map,文件,组ID映射信息,详见(man user_namespaces)。
  • /proc/[pid]/mountinfo,文件,挂载信息,格式为36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue,以空格作为分隔符,从左到右各字段的意思分别是唯一挂载ID、父挂载ID、文件系统的设备主从号码、文件系统中挂载的根节点、相对于进程根节点的挂载点、挂载权限等挂载配置、可选配置、短横线表示前面可选配置的结束、文件系统类型、文件系统特有的挂载源或者为none、额外配置。
  • /proc/[pid]/mounts,文件,挂载在当前进程的文件系统列表,格式参照(man fstab)。
  • /proc/[pid]/mountstats,文件,挂载信息,格式形如device /dev/sda7 mounted on /home with fstype ext3 [statistics]。
  • /proc/[pid]/ns/,目录,保存了每个名字空间的入口,详见(man namespaces)。

返回笔记列表
入门小站