/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.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值