proc简介

在linux的根目录下存在一个/proc目录,/proc文件系统是一种虚拟文件系统,以文件系统目录和文件形式,提供一个指向内核数据结构的接口,通过它能够查看和改变各种系统属性.proc目录通常情况下是由系统自动挂载在/proc目录下,但是我们也可以自行手动挂载.

1mount -t proc proc /proc

/proc目录下的大部分文件都是只读的,部分文件是可写的,我们通过这些可写的文件来修改内核的一些配置;

说明

在/proc目录下,一般会存在如下文件和目录.

/proc/pid

每一个/proc/pid目录中还存在一系列目录和文件,这些文件和目录记录的都是关于pid对应进程的信息.例如,在/proc/pid的目录下存在一个task目录,在task目录下又存在task/tid这样的目录,这个目录就是包含此进程中的每个线程的信息,其中的tid是内核线程的tid;通过 GETDENTS(2) 遍历/proc就能够看到所有的/proc/pid的目录,当然通过 ls -al /proc的方式也可以看到所有的信息.

/proc/tid

/proc/tid 每一个/proc/tid目录中还存在一系列目录和文件,这些文件和目录记录的都是有关线程tid对应的信息,这些信息与具体的/proc/pid/task/tid的目录相同,所记录的信息也是相同的.我们遍历/proc时并不能看到/proc/tid的信息,同样通过ls -al /proc的方式也无法看到.但是虽然无法看到,但是却可以通过cd /proc/tid进入到这个线程的内部;传统的通过ps | grep tid是无法看到信息的,通过ps -T -p pid的方式就能够看到tid的信息.

/proc/self

这是一个link,当进程访问此链接时,就会访问这个进程本身的/proc/pid目录,如下所示:

1

2ls -al /proc/self

lrwxrwxrwx 1 root root 0 Jun 4 17:08 /proc/self -> 32193

/proc/thread-self

这是一个link,当访问次链接时,就会访问进程的/proc/self/task/tid目录。

1

2ls -al /proc/thread-self

lrwxrwxrwx 1 root root 0 Jun 4 17:08 /proc/thread-self -> 32265/task/32265

/proc/[a-z]*

/proc/[a-z]*, proc下面还有许多其他的文件,记录了系统中的各种信息,Linux /proc、/dev Principle 这篇文章对proc目录下的文件进行了详细的说明.

文件和目录

在第一节主要是对poc目录进行了一个简单的介绍,本章节则主要是关注/proc/pid中记录的进程的具体的信息。

/proc/pid

每一个运行的进程都存在pid,对应的在/proc就存在一个/proc/pid的目录,这个/proc/pid目录也是一个伪文件系统.通常情况下每个/proc/pid是属于运行进程的有效用户的UID和GID.但是如果一个进程的dumpable属性的值大于1,从安全角度考虑,/proc/pid的属性就是root:root.

在4.11的内核版本之前,root:root表示的是全局UID和GID (在初始化的用户空间中的UID和GID都是0).但是在4.11之后的内核版本,如果这个进程不是在初始化的用户空间中,它的UID却是0,那么对应的/proc/pid的权限也是root:root.这就意味着在docker容器内,如果将进程的PID设置为0,那么这个进程在容器内就是以root权限运行的.

进程的dumpable的属性可能因为如下的原先发生改变:

通过 prctl 设置了 PR_SET_DUMPABLE 属性

通过 /proc/sys/fs/suid_dumpable文件修改

将dumpable重置为1,就可以恢复/proc/[pid]/*文件到进程有效的UID和GID.

/proc/pid/attr

/proc/pid/attr是一个目录,这个目录下的文件的作用是为安全模块提供了API.通过这些文件我们可以读取或者设置一些安全相关的选项.这个目录目前能够支持SELinux,但是本意是为了能够支持更多的其他的安全模块.以下将会演示SELinux如何使用这些文件.

PS: 只有内核开启了CONFIG_SECURITY选项,才能够看到这个目录.

/proc/pid/attr/current

这个文件的内容记录了当前进程的安全属性

在SELinux中,这个文件主要是用于得到当前进程的安全上下文.在2.6.11的内核之前,这个文件不能用来设置安全上下文(写操作是不允许的),因为SELinux限制了进程安全转换为 EXECVE(2) (参考下方的/proc/pid/attr/exec). 从2.6.11之后,SELinux取消了这个限制.如果策略允许,SELinux通过向这个文件写入来支持设置行为,虽然这个操作仅仅只是为了维护老的上下文和新的上下文的隔离.在2.6.28之前,SELinux不允许多线程程序的线程通过这个值来设置安全上下文,因为这样会导致共享内存空间的县城的安全上下文不一致.从2.6.28之后,SELinux取消了这个限制,开始支持多线程的设置方法.但是需要满足一定的条件,新的安全上下文需要绑定在老的上下文上,并且这个绑定关系是设置在策略当中的,同时新的安全上下文是老的安全上下文的一个子集.

/proc/pid/attr/exec

这个文件代表给进程的execve的属性.

在SELinux中,有时候需要支持role/domain的转换,execve(2)一般都是作为这种转换的首选,因为它提供了对进程的新的安全标签和状态继承的更好的控制.在SELinux中,如果重置了execve(2),那么这个程序就会恢复到execve(2)所设置的状态.

/proc/pid/attr/fscreate

SELinux通过此文件能够保证以一个安全的方式创建文件,所以这里不会存在不安全的访问的风险(在文件创建和文件属性设置).如果重置了execve(2),那么程序也会被重置,包括程序所创建的文件.

/proc/pid/attr/keycreate

如果进程将安全上下文写入此文件,那么所有创建key的行为都会被加载到此上下文中.更多的信息可以参考内核文件 Documentation/security/keys/core.rst(在Linux3.0和Linux4.13中文件是 Documentation/security/keys.txt 在Linux3.0之前是Documentation/keys.txt)

/proc/pid/attr/prev

这个文件包含了进程在执行最后一个execve(2)的安全上下文.换句话说,这个文件的内容是/proc/pid/attr/current前一个值

/proc/pid/attr/socketcreate

如果一个进程向这个文件写入安全上下文,那么之后所有的sockets的创建行为都会在此进程上下文中;

/proc/pid/autogroup

/proc/pid/auxv

这个文件包含了在进程执行时,传递给进程的ELF的解释器的信息.这个文件的格式是一个无符号的long类型的ID加上每个entry的一个无符号的long类型,这最后的一个entry包含了两个零。参考 getauxval(3)

/proc/pid/cgroup

/proc/pid/clear_refs

这是一个只写文件,只有进程的owner能够写.只有下面这些值能够被写入:

(Since Linux 2.6.22)对进程所有的相关的页重置所有的PG_Referenced 和ACCESSED/YOUNG位 (在2.6.32之前,任何的非零的值写入到此文件都是有效的)

(Since Linux2.6.32) 对进程所有的匿名页重置所有的PG_Referenced和ACCESSED/YOUNG位

(Since Linux2.6.32)对进程所有的与文件相关的页重置所有的PG_Referenced和ACCESSED/YOUNG位.清除所有的PG_Referenced和ACCESSED/YOUNG提供了一个方法用于测量一个进程是有了多少内存.第一个可以参考的是/proc/[pid]/smaps中的VMAs中的值.当清除了PG_Referenced和ACCESSED/YOUNG 经过一段时间之后,再次测量这个值.

(Since Linux3.11) 清空掉进程所有的页的soft-dirty位.通过向/proc/[pid]/clear_refs清空,就能够知道哪些页是被污染了.

将peak resident重置为进程当前的resident的大小.

如果向/proc/pid/clear_refs写入其他的任何值,不会有任何的效果;只有当启用了CONFGI_PROC_PAGE_MONITOR的内核选项之,才会出现/proc/pid/clear_refs文件

/proc/pid/cmdline

这个只读文件是包含了进程执行的完整命令.如果此进程是一个僵尸进程,那么次文件没有任何的内容.

/proc/pid/comm

此文件记录的是进程命令的comm.在同一个进程中的不同线程的comm可能不同,可以访问/proc/[pid]/task/tid/comm获取进程中的每个线程的comm.通过向/proc/self/task/tid/comm写入就能够修改自己或者其他线程的comm.如果comm超过TASK_COMM_LEN(16)就会被截断.

这个文件的值可以通过 prctl(2) 的PR_SET_NAME和PR_GET_NAME的操作来设置和获取,通过 pthread_setname_np(3) 能够设置线程的comm

/proc/pid/coredump_filter

/proc/pid/cpuset

/proc/pid/cwd

这是一个当前的进程的工作目录.比如如果想要知道pid为4451的进程的工作目录,可以通过如下的命令查看:

1cd /proc/4451/cwd; /bin/pwd

在bash环境下,可能会出现/bin/pwd: couldn’t find directory entry in ‘..’ with matching i-node的错误,这是因为pwd通常是shell内置的,需要使用这样的命令:

1/proc/4451/cwd; pwd -P

在多线程的程序中,如果主线程已经退出了,那么cwd的结果就是空.

取消或者是读取(readlink(2))这个链接的内容的权限是由ptrace的访问模式PTRACE_MODE_READ_FSCREDS来控制的,参考ptrace(2).

/proc/pid/environ

这个文件包含的是当程序使用execve启动程序时的环境变量的值,其中的entries是通过0x0分割的,结尾是可能是null.如果我们需要查询一个指定的进程的环境变量,我们可以采用如下的方法:

1

2

3

4

5

6

7

8#cat /proc/4451/environ | tr '\000' '\n'

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

HOSTNAME=commoncollection

LANG=C.UTF-8

JAVA_HOME=/docker-java-home/jre

JAVA_VERSION=8u212

JAVA_DEBIAN_VERSION=8u212-b01-1~deb9u1

HOME=/root

如果执行了execve(2)之后,进程调用了putenv(3)或者是直接修改environ(7) ,那么environ变量的值是无法随之改变的.

更进一步,进程能够通过prctl(2)修改PR_SET_MM_ENV_START的值来修改这个文件所引用的内存位置.

读取这个文件的权限是由ptrace(2)的PTRACE_MODE_READ_FSCREDS来控制.

/proc/pid/exe

在Linux2.2的内核及其之后,/proc/pid/exe是直接执行的二进制文件的符号链接.这个符号链接能够被取消.尝试打开这个文件就相当与打开了二进制文件,甚至可以通过重新输入/proc/pid/exe重新运行一个对应于pid的二进制文件.在一个多线程的程序中,如果主线程已经退出了,就无法访问这个符号链接.

在Linux2.0及其之前,/proc/pid/exe是指向当前进程执行的二进制文件.采用readlink()读取返回如下的结果: [device]:inode

/proc/pid/fd

这是一个子目录,包含了当前进程打开的每一个文件.每一个条目都是一个文件描述符,是一个符号链接,指向的是实际打开的地址.0表示标准输入,1表示标准输出,2表示标准错误.在多线程程序中,如果主程序退出了,那么这个文件夹将不能被访问.

程序能够使用文件名作为命令行参数,如果没有提供这样的参数,就不会从标准输入中读取信息也不会将标准输出发送到文件中.但是即使没有提供与文件相关的命令行参数,我们仍然可以使用标准的输出输入.例如我们可以通过-i和-o分别指向输入和输出文件.如下所是:

1$ foobar -i /proc/self/fd/0 -o /proc/self/fd/1 ...

在某些UNIX或者类似UNIX的系统中,/proc/self/fd/N与/dev/fd/N大致相同.大部分系统提供/dev/stdin,/dev/stdout,/dev/stderr的符号链接,分别只想的是/proc/self/fd中的0,1,2.所以上述的命令也可以写为:

1$ foobar -i /dev/stdin -o /dev/stdout ...

/proc/pid/fdinfo/

这是一个子目录,包括了当前进程打开的所有的文件的文件描述符.可以读取每一个文件描述符的内容一获取i信息.如下所示:

1

2

3

4$ cat /proc/5040/fdinfo/99

pos: 21718

flags: 0100000

mnt_id: 27

pos 是十进制,显示当前文件的偏移量

flag是八进制,显示文件的访问模式和文件状态标志.

该目录中的文件只有进程的所有者才可以读.

/proc/pid/limits

该文件显示了每个进程的软中断,硬中断和度量单位.在Linux2.6.35之前,这个文件仅仅只能被进程实际的UID访问.在26.36之后,该文件可以被系统中所有的用户读取.

/proc/pid/maps

包含了当前进程映射的内存区域以及他们的访问权限.文件格式如下:

1

2

3

4

5

6

7

8

9

10address perms offset dev inode pathname

08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm

08056000-08058000 rw-p 0000d000 03:0c 64593 /usr/sbin/gpm

08058000-0805b000 rwxp 00000000 00:00 0

40000000-40013000 r-xp 00000000 03:0c 4165 /lib/ld-2.2.4.so

40013000-40015000 rw-p 00012000 03:0c 4165 /lib/ld-2.2.4.so

4001f000-40135000 r-xp 00000000 03:0c 45494 /lib/libc-2.2.4.so

40135000-4013e000 rw-p 00115000 03:0c 45494 /lib/libc-2.2.4.so

4013e000-40142000 rw-p 00000000 00:00 0

bffff000-c0000000 rwxp 00000000 00:00 0

address,表示进程占用的地址.

perms, 表示一系列权限.r=read,w=write,x=execute,s=shared,p=private(copy on write)

offset, 表示文件偏移量

dev:表示设备 (主要设备,次要设备)

inode: 表示设备上面的inode编号.如果是0,表示没有索引节点与内存区域关联,就如同BSS段一样.

pathname,在Linux2.0之前,没有pathname字段.

/proc/pid/mem

该文件可以通过open,read,seek访问进程的内存页.

/proc/pid/mountinfo

这个文件主要是包含了挂载信息.文件内容结构如下:

1

236 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue

(1)(2)(3)(4) (5) (6) (7) (8) (9) (10) (11)

mount ID,挂载点的唯一标识

parent ID,当前挂载点的父挂载点的ID

major:minor, files的st_dev的值

root: 文件系统的根挂载点

mount point: 相对于进程根目录的挂载点

mount options: 预挂载选项

options fields: tag:[value]类型的字段

sparator: options fields结束标志

file systemtype: 文件系统的名称,以type[.subtype]的方式命名

mount source: 文件特定信息

super options: 超级块选项

/proc/pid/mounts

列出在当前进程挂载空间下所有的已经挂载过的文件.文件的格式通过 fstab 查看.在kernel 2.6.15之后,这个文件是论询式的.在读取文件之后,这个事件会导致select标记这个文件是可读的,并且pool()和epoll_wait()会将此文件标记为遇到了错误.

/proc/pid/mountstas

该文件会列举在当前进程挂载空间下的所有挂载点的详细信息,包括统计信息,配置信息.文件格式如下:

1

2device /dev/sda7 mounted on /home with fstype ext3 [statistics]

( 1 ) ( 2 ) (3 ) (4)

载的设备名

挂载点

文件系统类型

可选的统计和配置信息.在2.6.26之后,仅NFS文件系统可以到处此字段信息

/proc/pid/ns/

这是一个子目录.每一个子目录可以通过 setns 操作.关于更多的操作,参见clone

/proc/pid/ns/ipc

将文件挂载在其他地方可以使pid指定的进程的IPC命名空间保持活动状态,即使在当前命名空间的所有的进程全部都截止了.打开次文件就会返回文件句柄.只要文件保持打开状态,那么IPC的命名空间就可以保持活动状态.文件描述符可以通过 setns 传递.

/proc/pid/ns/net

将文件挂载在其他地方可以使pid指定的进程的网络命名空间保持活动状态,即使在当前命名空间的所有的进程全部都截止了.打开次文件就会返回文件句柄.只要文件保持打开状态,那么网络的命名空间就可以保持活动状态.文件描述符可以通过 setns 传递.

/proc/pid/ns/uts

将文件挂载在其他地方可以使pid指定的进程的UTS 命名空间保持活动状态,即使在当前命名空间的所有的进程全部都截止了.打开次文件就会返回文件句柄.只要文件保持打开状态,那么UTS命名空间就可以保持活动状态.文件描述符可以通过 setns 传递

/proc/pid/numa_maps

/proc/pid/oom_adj

这个方法用于决定在出现OOM的情况下,哪个进程被杀掉.内核使用该值对进程的oom_score的值进行设定,oom_score的有效取值区间是-17至15.-17将会完全杀死这个进程.正数会增加进程当oom时被杀掉的可能性,负数会减小进程被oom杀掉的可能性.

该文件的默认值是0.新进程会继承其父进程的oom_adj设置.只有具有CAP_SYS_RESOURCE权限的进程才能够更新此文件.

在Linux2.6.36,推荐使用/proc/[pid]/oom_score_adj.

/proc/pid/oom_score

该文件显示了如果内核出现oom情况时决定杀死该进程时的分数.分数越高意味着进程越容易被杀掉.

/proc/pid/oom_adj_score

这个文件用于调整在内存不足时应该杀掉哪个进程的分数判断.

/proc/pid/root

该值可以用于 chroot 预先设定进程的根文件系统. 这个文件指向当前进程的根目录.作业类似于前面说过的 exe fd/* 等等.

在多线程的程序中,如果主线程推出了此符号链接的内容将无法访问.

/proc/pid/smaps

这个文件显示了每个进程映射的内存消耗.每一个内存消耗都有如下的设置:

1

2

3

4

5

6

708048000-080bc000 r-xp 00000000 03:02 13130 /bin/bash

Size: 464 kB

Rss: 424 kB

Shared_Clean: 424 kB

Shared_Dirty: 0 kB

Private_Clean: 0 kB

Private_Dirty: 0 kB

第一行显示的信息与/proc/[pid]/maps中的映射信息相同.剩下分别表示的是,映射的大小,RAM中当前驻留的映射大小,映射中干净和脏共享页的大小以及映射中干净和脏共享私有页数.

只有在启用了CONFIG_MMU内核配置选项时,此文件才会存在.

/proc/pid/stat

关于进程的状态信息.主要是用于 ps 展示.文件中的每一行的含义如下:

pid %d 进程PID

comm %s 可执行文件的文件名

state %c 进程的状态,使用RSDZTW其中一个值表示.R表示正在运行,S表示因为中断休眠,D表示进程处于不可中断的睡眠, When a process will go to ‘D’ state?. Z表示僵尸进程,T表示正在被追踪或者停止,W表示现在正在进行叶交换.

ppid %d 父进程PID

grid %d 进程组ID

session %d 进程的session id

tty_nr %d 进程的控制终端

tpgid %d 进程控制终端的前台进程id

minflt %n 进程因为不需要从磁盘加载内存页而造成的次要故障数

cminflt %u 进程等待子进程造成的次要故障数

majflt %lu 进程需要从磁盘加载内存页造成的故障数

cmajflt %lu 进程等待子进程造成的故障数

utime %lu 进程在用户模式下被调度的时间

stime %lu 进程在内核模式下被调度的时间

cutime %ld 进程在用户模式下等待子进程的时间

cstime %ld 进程在内核模式下等待子进程的时间

nice %ld 参见 setpriority 位于19到-20之间.

num_threads %ld 当前进程的线程数量

vsize %lu 使用的虚拟内存

rss %ld resident set szie的缩写,表示进程在实际内存中的页数,主要是包括了text,data,栈,不包括没有加载到内存中或者已经被换出去的内存大小

rsslim %lu 进程rss的限制

还有一些不常见的字段,就不做说明了

/proc/pid/statm

提供内存的使用情况.格式如下所示:

1

2

3

4

5

6

7

8

9size (1) total program size

(same as VmSize in /proc/[pid]/status)

resident (2) resident set size

(same as VmRSS in /proc/[pid]/status)

share (3) shared pages (i.e., backed by a file)

text (4) text (code)

lib (5) library (unused in Linux 2.6)

data (6) data + stack

dt (7) dirty pages (unused in Linux 2.6)

/proc/pid/status

以更加可读的形式提供与/proc/pid/stat和/proc/pid/statm一样的信息.以下是示例.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38$ cat /proc/$$/status

Name: bash

State: S (sleeping)

Tgid: 3515

Pid: 3515

PPid: 3452

TracerPid: 0

Uid: 1000 1000 1000 1000

Gid: 100 100 100 100

FDSize: 256

Groups: 16 33 100

VmPeak: 9136 kB

VmSize: 7896 kB

VmLck: 0 kB

VmHWM: 7572 kB

VmRSS: 6316 kB

VmData: 5224 kB

VmStk: 88 kB

VmExe: 572 kB

VmLib: 1708 kB

VmPTE: 20 kB

Threads: 1

SigQ: 0/3067

SigPnd: 0000000000000000

ShdPnd: 0000000000000000

SigBlk: 0000000000010000

SigIgn: 0000000000384004

SigCgt: 000000004b813efb

CapInh: 0000000000000000

CapPrm: 0000000000000000

CapEff: 0000000000000000

CapBnd: ffffffffffffffff

Cpus_allowed: 00000001

Cpus_allowed_list: 0

Mems_allowed: 1

Mems_allowed_list: 0

voluntary_ctxt_switches: 150

nonvoluntary_ctxt_switches: 545

/proc/pid/task

该目录包含的是进程中的每一个线程.每一个目录的名字是以线程ID命名的(tid).在每一个tid下面的目录结构与/proc/pid下面的目录结构相同.对于所有线程共享的属性,task/tid子目录中的每个文件内容与/proc/pid目录中的相应文件内容相同.例如所有线程中的task/tid/cwd文件和父目录中的/proc/pid/cwd文件内容相同,因为所有的线程共享一个工作目录.对于每个线程的不同属性,task/tid下相应文件的值也不相同.

/proc/cmdline

在引导时传递给内核的参数

/proc/cpuinfo

cpu和系统结构的信息.常见信息包括CPU的数量以及常见的系统常数.

/proc/meminfo

此文件包含了系统当前内存的使用信息. free 用来报告系统中可用内存和已使用内存(物理内存和交换内存)以及内核中共享内存和缓冲区的大小.每一行都是以 参数名:参数值 显示.格式如下所示:

1

2

3

4

5

6

7

8

9

10

11

12$ cat /proc/$$/status

Name: bash

State: S (sleeping)

Tgid: 3515

Pid: 3515

PPid: 3452

TracerPid: 0

Uid: 1000 1000 1000 1000

Gid: 100 100 100 100

FDSize: 256

Groups: 16 33 100

.......

/proc/modules

显示当前加载到系统中所有的模块.

/proc/mounts

在内核2.4.19之前,这个文件会列举当前系统中挂载的所有的节点信息.在2.4.19之后,仅仅只会列举出当前进程在mount的命名空间下的挂载信息,即/proc/self/mounts的挂载信息,参见 fstab

/proc/net

此目录下面个中文虚拟的文件系统,主要是记录了系统中各种与网络有关的信息.这个文件都是普通ASCII文件,都可以通过cat的方式读取.

/proc/net/arp

此文件主要是包含了用于地址解析的内核ARP表的信息.示例如下:

1

2

3IP address HW type Flags HW address Mask Device

192.168.0.50 0x1 0x2 00:50:BF:25:68:F3 * eth0

192.168.0.250 0x1 0xc 00:00:00:00:00:00 * eth0

IP address 是主机的IPv4的地址

HW type 是来自与RFC826的硬件类型的地址

Flags 是ARP 结构中的内部标识 参见 /usr/include/linux/if_arp.h

HW address 是数据链路层的映射地址

/proc/net/dev

dev虚拟文件系统显示网络状态的信息,包括发送和接受的数据包的数量,错误和冲突以及其他的统计信息,这些信息也可以通过ifconfig查看. 示例如下:

1

2

3

4

5

6Inter-| Receive | Transmit

face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed

lo: 2776770 11307 0 0 0 0 0 0 2776770 11307 0 0 0 0 0 0

eth0: 1215645 2751 0 0 0 0 0 0 1782404 4324 0 0 0 427 0 0

ppp0: 1622270 5552 1 0 0 0 0 0 354130 5669 0 0 0 0 0 0

tap0: 7714 81 0 0 0 0 0 0 7714 81 0 0 0 0 0

/proc/net/raw

存储的是RAW套接字表的信息

/proc/net/snmp

保存的是SNMP代理的IP,ICMP以及UDP的管理信息

/proc/net/tcp

保存的是系统中的TCP表的信息

/proc/net/udp

保存的是系统中的UDP表的信息

/proc/net/unix

显示当前系统所有的UNIX domain socket以及它们的状态信息.示例如下:

1

2

3Num RefCount Protocol Flags Type St Path

0: 00000002 00000000 00000000 0001 03

1: 00000001 00000000 00010000 0001 01 /dev/printer

Num 是kernle table slot number

Refcount 是使用这个套接字的用户数

Protocol 当前永远是0

Flags 表示当前内部内核标志 用于表示套接字状态

Type 当前永远是1

St 套接字内部状态

Path 是套接字绑定路径

/proc/stat

内核/系统的信息

/proc/sys

该目录下有很多的目录和子目录,其中主要是记录了与内核变量相关的信息.

/dev

dev目录下面的文件表示的是linux的设备.直接读/写/文件就可以向设备发送读或者写操作.按照读写存储数据方式,可以将dev下面的文件分为 字符型设备,块设备 伪设备.

字符型设备

字符设备是指每次与系统传输1个字符的设备.这些设备节点通常为传真,虚拟终端和串口调制解调器,键盘之类设备提供通信服务,它通常不支持随机存储数据.字符设备在实现时,大多不使用缓存其.系统直接从设备读取/写入每一个字符.

块设备

块设备是指与系统间用块的方式移动数据的设备,这些设备节点通常代表可寻址设备,如硬盘,CD-ROM和内存区域.块设备通常支持随机存取和寻址,并使用缓存器

伪设备

在类unix操作系统中,设备节点并不一定要对应物理设备.没有这种对应关系的设备是伪设备.常见的伪设备包括 null,zero,full,loop,random,urandom

常见的dev设备文件

对常见的dev设备进行说明

/dev/hd[a-t]:IDE设备

/dev/sd[a-z]:SCSI设备

/dev/fd[0-7]:标准软驱

/dev/md[0-31]:软raid设备

/dev/loop[0-7]:本地回环设备

/dev/ram[0-15]:内存

/dev/null:无限数据接收设备,相当于黑洞

/dev/zero:无限零资源

/dev/tty[0-63]:虚拟终端

/dev/ttyS[0-3]:串口

/dev/lp[0-3]:并口

/dev/console:控制台(tty)

/dev/fb[0-31]:framebuffer

/dev/cdrom => /dev/hdc

/dev/modem => /dev/ttyS[0-9]

/dev/pilot => /dev/ttyS[0-9]

/dev/random:随机数设备

/dev/urandom:随机数设备

/dev/tty

tty

“tty”这个词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后 来这东西被键盘与显示器取代,所以现在叫终端比较合适。

终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。通常我们在linux下看到的控制台(console)是由几个设备完成的。分别是:

1

2

3

4

5

6

7

8

9

10

11

121. /dev/tty0

tty0就是/dev/console,由linux/drivers/char/console.c对应

2. /dev/tty1

3. /dev/tty2

tty1,tty2就是不同的虚拟终端(virtual console)。通常使用热键alt+Fn来在这些虚拟终端之间进行切换。由和vt.c对应

4. /dev/tty3

5. /dev/tty4

6. /dev/tty5

7. /dev/tty6

...

pty

远程登录交互终端shell设备,我们在远程telnet到主机或使用xterm时也需要一个终端交互,这就是虚拟终端pty(pseudo-tty).

/dev/pts是远程登陆(telnet,ssh等)后创建的控制台设备文件所在的目录。由于可能有好几千个用户登陆,所以/dev/pts其实是动态生成的,不象其他设备文件是构建系统时就已经产生的硬盘节点(如果未使用devfs)

1

2

3

4

5

61. /dev/pts/0

第一个用户登陆,console的设备文件为/dev/pts/0

2. /dev/pts/1

第二个为/dev/pts/1

3. 以此类推

//这里的0、1、2、3不是具体的标准输入或输出,而是整个控制台

总结

/proc目录下还有许多目录,但是本文并没有介绍,主要原因是这些信息在平时查询或者使用都比较少,所以没有介绍.如果有兴趣,可以自行阅读proc手册.

参考

linux proc 目录清理_Linux下/proc目录简介相关推荐

  1. linux proc 目录清理_Linux文件及目录管理命令基础

    目录 前言 下面是常用命令的介绍,这些命令都是以后会用到的,熟练掌握便是最终的目标. 第一章 Linux文件及目录管理命令基础 1.1 pwd: 显示当前所在位置的信息 [功能说明] 显示当前所在目录 ...

  2. linux mysql 装哪里_linux 下 mysql 安装目录在哪里

    linux 下 mysql 安装目录在哪里.linux mysql 安装介绍: linux 服务器 RedHat 5.0.server. MySQL 版本: 下载地址链接:http://dev.mys ...

  3. linux文件移出目录命令_Linux 文件与目录管理详解

    一.目录树 在 Linux 底下,所有的文件与目录都是由根目录开始的. 根目录是所有目录与文件的源头,再一个一个的分支下来,有点像是树枝状. 因此,我们也称这种目录配置方式为:『目录树(directo ...

  4. linux重新安装mysql步骤_Linux下MySQL安装及相关操作过程

    一.安装MySQL数据库,但是前提是已经安好Linux系统,我使用的是Red hat desktop 6.0 SP1,系统盘的Tools里面有相应的软件,为5.0系列,但经测试无法使用,不能正常运行, ...

  5. qc linux mysql 安装教程_linux下安装mysql

    1.现在mysql官网上下载了服务端和客户端两个软件: MySQL-client-community-5.1.53-1.rhel5.i386.rpm MySQL-server-community-5. ...

  6. linux python虚拟环境搭建_Linux 下创建python 虚拟环境

    简要记录 Linux 下安装python虚拟环境的方法.以下内容基于 python2.7 版本 1 安装virtualenv pip install virtualenv 检查版本 virtualen ...

  7. linux 切换python版本_linux下多个python版本切换如何设置

    比如自带的是2.6,那么我想装2.7和3.3,分别开发不同的东西. 那么,如何再2.7和3.3之间切换,而不影响自带的2.6呢? VirtualEnv 是什么 VirtualEnv用于在一台机器上创建 ...

  8. linux wordpress mysql 配置_linux下搭建wordpress站点

    搭建php站点 安装并启动 apache | mysql | php yum install -y httpd mysql mysql-server php php-mysql #启动apache m ...

  9. linux下mysql目录结构_linux下mysql安装配置与目录结构

    本节内容: linux下mysql安装与配置.mysql目录结构. 1.准备安装程序(官方网站下载) 服务端:MySQL-server-community-5.1.44-1.rhel4.i386.rp ...

最新文章

  1. 批量残差网络-Aggregated Residual Transformations for Deep Neural Networks
  2. extjs 中iframe内存泄漏的问题
  3. 《那些年啊,那些事——一个程序员的奋斗史》——117
  4. MyBatis的架构和其运行流程
  5. Python命令行运行文件的实例方法
  6. linux挂载efi分区,IBM X3850安装linux出现 您还么有创建/boot/efi分区 解决办法
  7. 一键对频对讲机好吗_挑战传统,新型对讲机展现独特一面--极蜂智能网络对讲机...
  8. IDEA的使用,手把手带你快速入门IDEA
  9. REACT是否真的就比VUE强?(文末附两个框架的学习福利)
  10. setupUi()引起的麻烦
  11. 接口 同花顺_Fiddler模拟接口数据(mock)
  12. Python编码格式导致的csv读取错误
  13. 耦合器滤波器衰减器无源器件自动化测试软件系统,纳米NSAT-1000
  14. os_pend_multi.c
  15. C++描述 LeetCode 5676. 生成交替二进制字符串的最少操作数
  16. 2022.10.14 英语背诵
  17. 使用VNC连接树莓派4b如何全屏1080p分辨率,一次更改永久有效!
  18. windows显示.repo隐藏文件夹
  19. Android P Settings默认显示开发者选项
  20. 阿里云对腾讯企业邮箱设置域名解析

热门文章

  1. 瓦片地图坐标与经纬度换算公式python实现
  2. 金融组织数字化研发管理的12种武器
  3. 《咬文嚼字》公布今年国人十大常犯语文差错
  4. python opencv 视频加快播放_如何使用openCV提高Python中的视频播放速度
  5. 安装配置Java 开发工具IDEA
  6. 干货:工作中常用 Linux 命令汇总!乔戈里知道你需要
  7. 武大计算机专硕难还是学硕难,考研难度有多大?看完武大考生的信息,我很庆幸自己已经上岸...
  8. 简单直观 DataGrip使Redis可视化的第三方插件
  9. 跑带宽度多少合适_易跑科普:一般跑步机跑带宽度和长度多少合适?
  10. python之append、expend函数详解