/proc —— 进程信息伪文件系统

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

proc是伪文件系统,它提供了和内核数据结构交互的接口。通常它挂载在/proc目录下。
大致分为下面的组和子目录:

  • /proc/[pid]
    包含进程信息, a task subdirectory contains subdirectories of the form task/[tid], which contain corresponding information about each of the threads in the process, where tid is the kernel thread ID of the thread.
    该目录可被ls观察到
  • /proc/[tid]
    thread相关的资源信息,与/proc/[pid]/task/[tid]是一样的。
    /proc/[tid]不能被getdents遍历到因此不能被ls观察但可直接cd
  • /proc/self
  • /proc/thread-self
  • /proc/[a-z]*
    system-wide info

[pid]/attr

该目录内的东西是为了支持安全相关的内容,如支持SELinux等安全模块。

只有当内核配置为 CONFIG_SECURITY 才有该目录。

attr/current

该文件表示了最近进程的安全属性

在SELinux中,该文件用于获取进程的安全上下文。

[pid]/cmdline

完整的命令行

僵尸进程为空

execve改变的argv将会在这里呈现

[pid]/comm

线程可通过写入 /proc/self/task/[tid]/comm 改变本线程组的comm,大于TASK_COMM_LEN的字符(包括’\0’)会被截断,最多15个可显示字符

pthread_setname_np通过它重命名线程

可用于在core文件中标识不同线程

[pid]/coredump_filter

用于设置哪些内存段存入core文件

[pid]/cwd

指向当前工作目录的符号链接

cd /proc/[pid]/cwd; pwd -P

[pid]/environ

execve后的初始环境变量(char* env[]):
cat /proc/1/environ | tr ‘\000’ ‘\n’

后续对 putenv 或者 environ变量的改变不会反映到该文件!!!

[pid]/exe

符号链接,指向可执行文件的绝对路径

[pid]/fd/

包含进程打开的所有的文件描述符(符号链接)

对于 pipe 和 socket :
type[inode]

[pid]/fdinfo/

文件描述符信息,只读

  • 常规文件
    pos:    1000        # offset
    flags:  01002002  # 标识 包含open时的flag
    mnt_id: 21        # 挂载点id
    
  • eventfd
     pos: 0
     flags:    02
     mnt_id:   10
     eventfd-count:               40  # 十六进制计数
    
  • epoll文件描述符
  • signalfd
    pos: 0
    flags:    02
    mnt_id:   10
    # 十六进制信号屏蔽集,下面屏蔽了SIGINT和SIGQUIT信号
    sigmask:  0000000000000006
    
  • timerfd

。。。。。。

[pid]/gid_map uid_map

man 7 user_namespaces

[pid]/limits

This file displays the soft limit, hard limit, and units of measurement for each of the process’s resource limits
ulimits -a 可看

[pid]/map_files/

This subdirectory contains entries corresponding to memory-mapped files (see mmap(2)).

[pid]/maps

进程的内存空间

address           perms offset  dev   inode       pathname
00400000-00452000 r-xp 00000000 08:02 173521      /usr/bin/dbus-daemon
00651000-00652000 r--p 00051000 08:02 173521      /usr/bin/dbus-daemon
00652000-00655000 rw-p 00052000 08:02 173521      /usr/bin/dbus-daemon
00e03000-00e24000 rw-p 00000000 00:00 0           [heap]
00e24000-011f7000 rw-p 00000000 00:00 0           [heap]
...
35b1800000-35b1820000 r-xp 00000000 08:02 135522  /usr/lib64/ld-2.15.so
35b1a1f000-35b1a20000 r--p 0001f000 08:02 135522  /usr/lib64/ld-2.15.so
35b1a20000-35b1a21000 rw-p 00020000 08:02 135522  /usr/lib64/ld-2.15.so
35b1a21000-35b1a22000 rw-p 00000000 00:00 0
35b1c00000-35b1dac000 r-xp 00000000 08:02 135870  /usr/lib64/libc-2.15.so
35b1dac000-35b1fac000 ---p 001ac000 08:02 135870  /usr/lib64/libc-2.15.so
35b1fac000-35b1fb0000 r--p 001ac000 08:02 135870  /usr/lib64/libc-2.15.so
35b1fb0000-35b1fb2000 rw-p 001b0000 08:02 135870  /usr/lib64/libc-2.15.so
...
f2c6ff8c000-7f2c7078c000 rw-p 00000000 00:00 0    [stack:986]
...
7fffb2c0d000-7fffb2c2e000 rw-p 00000000 00:00 0   [stack]
7fffb2d48000-7fffb2d49000 r-xp 00000000 00:00 0   [vdso]

address: 进程虚拟内存地址

perms:
r = read
w = write
x = execute
s = shared
p = private(copy on write)

offset: 在file/whatever中的偏移量

dev: 设备(major:minor)

inode: 在该设备中的inode,0意味无inode与该段内存关联,如BSS段

pathname:该内存段映射的文件

[stack] 初始化(main线程)栈区

[stack:<\tid>] 线程栈 (在Linux3.4~4.4)中存在,在4.4之后移除了,因为在有超多线程的进程中提供该信息非常占用资源

[vdso] 虚拟动态链接共享库,它是一个small的共享库,内核会自动的将它映射到所有进程的用户空间。应用不需要关心这些细节,因为它会由C库调用。像往常一样使用标准函数接口,C库会处理与VDSO相关的功能。该库的存在是为了解决高频调用syscall而导致的用户态-内核态/上下文切换的开销。请使用C库的标准接口。

在x86 32-bit systems 通过触发软中断( int $0x80 )来告诉内核应用想要进行系统调用。
但是该指令的代价是十分昂贵的。通过vdso内核提供了一种机制,
例如获取事件的函数,gettimeofday,将它从系统调用转换成了一个普遍的函数调用

[heap] 进程堆区

如果一个pathname是空的,代表它是匿名的,There is no easy way to coordinate this back to a process’s source, short of running it through gdb(1), strace(1), or similar.

如果对虚拟内存进行了超越 perms 的访问则会触发 segmentation fault

[pid]/mem

用于通过open,read, lseek来访问进程的内存页

[pid]/mountinfo

process’s mount namespace内的挂载点的相关信息

[pid]/ns/

与namespace相关

[pid]/pagemap

进程虚拟内存页和物理内存页的映射,或者是虚拟内存页和swap的映射

[pid]/root

每个进程的文件系统根目录,由chroot syscall设置

[pid]/smaps

每个进程mapping的内存消耗

                  00400000-0048a000 r-xp 00000000 fd:03 960637       /bin/bash
                  Size:                552 kB
                  Rss:                 460 kB
                  Pss:                 100 kB
                  Shared_Clean:        452 kB
                  Shared_Dirty:          0 kB
                  Private_Clean:         8 kB
                  Private_Dirty:         0 kB
                  Referenced:          460 kB
                  Anonymous:             0 kB
                  AnonHugePages:         0 kB
                  ShmemHugePages:        0 kB
                  ShmemPmdMapped:        0 kB
                  Swap:                  0 kB
                  KernelPageSize:        4 kB
                  MMUPageSize:           4 kB
                  KernelPageSize:        4 kB
                  MMUPageSize:           4 kB
                  Locked:                0 kB
                  ProtectionKey:         0
                  VmFlags: rd ex mr mw me dw

第一行和maps一样

Rss: 当前驻留在RAM中的映射量

只有当内核配置CONFIG_PROC_PAGE_MONITOR开启时才有该文件

[pid]/stack

提供该进程内核栈的函数调用的符号追踪

[pid]/stat

该进程的状态信息,被ps命令使用

[pid]/statm

提供内存占用相关信息

[pid]/status

相比stat,statm,提供更详细的信息

[pid]/syscall

暴露进程最近执行系统调用号和参数寄存器

[pid]/task

包含一个进程中的所有线程

[pid]/task/[tid]/children

该task的子task

内核需配置CONFIG_PROC_CHILDREN参数

[pid]/timers

POSIX timers

# timer id 和 timer_create返回的timer ID不同,它和内核内部的ID(siginfo_t.si_timerid)相同
ID: 1
# timer用于分发通知的信号,/后是一个由sigev_value提供的signal handler
signal: 60/00007fff86e452a8
# 分发通知的机制(signal / thread / none)/
notify: signal/pid.2634
ClockID: 0
ID: 0
signal: 60/00007fff86e452a8
notify: signal/pid.2634
ClockID: 1

[pid]/wchan

The symbolic name corresponding to the location in the kernel where the process is sleeping.

apm

advanced power management

buddyinfo

用于诊断内存碎片问题

cmdline

启动时传入内核的参数

filesystems

内核支持的文件系统

iomem

I/O 内存映射

loadavg

locks

显示最近的file locks(flock(2) and fcntl(2))

1: POSIX  ADVISORY  READ  5433 08:01:7864448 128 128
2: FLOCK  ADVISORY  WRITE 2001 08:01:7864554 0 EOF
3: FLOCK  ADVISORY  WRITE 1568 00:2f:32388 0 EOF
4: POSIX  ADVISORY  WRITE 699 00:16:28457 0 EOF
5: POSIX  ADVISORY  WRITE 764 00:16:21448 0 0
6: POSIX  ADVISORY  READ  3548 08:01:7867240 1 1
7: POSIX  ADVISORY  READ  3548 08:01:7865567 1826 2335
8: OFDLCK ADVISORY  WRITE -1 08:01:8713209 128 191

meminfo

报告系统的内存使用率的静态统计。free命令会用到该信息

modules

内核模块

net/

与网络相关的目录

net/arp

用于地址决议的内核arp表

net/dev

包含网络设备状态信息,ifconfig命令会用到它,包括虚拟网卡等

net/raw tcp udp unix

partitions

每个分区的major:minor

slabinfo

kernel caches. see slabinfo(5)

stat

kernel/system 统计

swaps

see swapon(8)

sys

与内核变量有关

uptime

自系统启动以来的时间和多核总的空闲时间

version

/proc/sys/kernel/ostype, /proc/sys/kernel/osrelease, and /proc/sys/kernel/version

vmstat

虚拟内存统计

zoneinfo

This file displays information about memory zones. This is useful for analyzing virtual memory behavior.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值