当前位置: 技术问答>linux和unix
linux/proc
来源: 互联网 发布时间:2014-12-19
本文导语: 有谁知道linux/proc下面对应的意义? 关于进程,上下文切换,磁盘读写请求! 如有电子文档,重谢! | PROC Section: ;Linux Programmer's Manual; (5) Updated: ;22 July 1996; Index Return to Main Contents ------...
有谁知道linux/proc下面对应的意义?
关于进程,上下文切换,磁盘读写请求!
如有电子文档,重谢!
关于进程,上下文切换,磁盘读写请求!
如有电子文档,重谢!
|
PROC
Section: ;Linux Programmer's Manual; (5)
Updated: ;22 July 1996;
Index Return to Main Contents
--------------------------------------------------------------------------------
NAME [名字]
proc - 进程信息伪文件系统
描述
/proc 是一个伪文件系统, 被用作内核数据结构的接口, 而不仅仅是解释说明
/dev/kmem. /proc里的大多数文件都是只读的,
但也可以通过写一些文件来改变内核变量.
下面对整个 /proc 目录作一个大略的介绍.
[number]
在 /proc 目录里, 每个正在运行的进程都有一个以该进程 ID 命名的子目录,
其下包括如下的目录和伪文件.
cmdline
该文件保存了进程的完整命令行. 如果该进程已经被交换出内存,
或者该进程已经僵死, 那么就没有任何东西在该文件里,
这时候对该文件的读操作将返回零个字符. 该文件以空字符 null
而不是换行符作为结束标志.
cwd
一个符号连接, 指向进程当前的工作目录. 例如, 要找出进程 20 的 cwd, 你可以:
cd /proc/20/cwd; /bin/pwd
请注意 pwd 命令通常是 shell 内置的, 在这样的情况下可能工作得不是很好.
environ
该文件保存进程的环境变量, 各项之间以空字符分隔, 结尾也可能是一个空字符.
因此, 如果要输出进程 1 的环境变量, 你应该:
(cat /proc/1/environ; echo) | tr ";00"; ";n";
(至于为什么想要这么做, 请参阅 lilo(8).)
exe
也是一个符号连接, 指向被执行的二进制代码. 在 Linux 2.0 或者更早的版本下, 对
exe 特殊文件的 readlink(2) 返回一个如下格式的字符串: [设备号]:节点号
举个例子, [0301]:1502 就是某设备的 1502 节点, 该设备的主设备号为 03 (如
IDE, MFM 等驱动器), 从设备号为 01 (第一个驱动器的第一分区). 而在 Linux 2.2
下, readlink(2) 则给出命令的实际路径名. 另外,
该符号连接也可以正常析引用(试图打开 exe 文件实际上将打开一个可执行文件).
你甚至可以键入 /proc/[number]/exe 来运行 [number] 进程的副本. 带 -inum
选项的 find(1) 命令可以定位该文件.
fd
进程所打开的每个文件都有一个符号连接在该子目录里, 以文件描述符命名,
这个名字实际上是指向真正的文件的符号连接,(和 exe 记录一样).例如, 0
是标准输入, 1 是标准输出, 2 是标准错误, 等等.
程序有时可能想要读取一个文件却不想要标准输入,或者想写到一个文件却不想将输出送
到标准输出去,那么就可以很有效地用如下的办法骗过(假定 -i 是输入文件的标志,
而 -o 是输出文件的标志):
foobar -i /proc/self/fd/0 -o /proc/self/fd/1 ...
这样就是一个能运转的过滤器. 请注意该方法不能用来在文件里搜索, 这是因为 fd
目录里的文件是不可搜索的. 在 UNIX 类的系统下, /proc/self/fd/N 基本上就与
/dev/fd/N 相同. 实际上, 大多数的 Linux MAKEDEV 脚本都将 /dev/fd 符号连接到
[..]/proc/self/fd 上.
maps
该文件包含当前的映象内存区及他们的访问许可. 格式如下:
address perms offset dev inode
00000000-0002f000 r-x-- 00000400 03:03 1401
0002f000-00032000 rwx-p 0002f400 03:03 1401
00032000-0005b000 rwx-p 00000000 00:00 0
60000000-60098000 rwx-p 00000400 03:03 215
60098000-600c7000 rwx-p 00000000 00:00 0
bfffa000-c0000000 rwx-p 00000000 00:00 0
address 是进程所占据的地址空间, perms 是权限集:
r = read
w = write
x = execute
s = shared
p = private (copy on write)
offset 是文件或者别的什么的偏移量, dev 是设备号(主设备号:从设备号), 而
inode 则是设备的节点号. 0 表明没有节点与内存相对应, 就象 bss 的情形.
在 Linux 2.2 下还增加了一个域给可用的路径名.
mem
该文件并不是 mem (1:1) 设备, 尽管它们有相同的设备号. /dev/mem
设备是做任何地址转换之前的物理内存, 而这里的 mem
文件是访问它的进程的内存.目前这个 mem 还不能 mmap(2)
(内存映射)出去,而且可能一直要等到内核中增加了一个通用的 mmap(2)
以后才能实现. (也许在你读本手册页时这一切已经发生了)
mmap
mmap(2) 做的 maps 映射目录,是和 exe, fd/* 等类似的符号连接. 请注意 maps
包含了比 /proc/*/mmap 更多的信息, 所以应该废弃 mmap. ";0"; 通常指
libc.so.4. 在 linux 内核 1.1.40 里, /proc/*/mmap 被取消了. (现在是 真的
废弃不用了!)
root
依靠系统调用 chroot(2), unix 和 linux 可以让每个进程有各自的文件系统根目录.
由 chroot(2) 系统调用设置.根指向文件系统的根,性质就象 exe, fd/* 等一样.
stat
进程状态信息, 被命令 ps(1) 使用. 现将该文件里各域, 以及他们的 scanf(3)
格式说明符, 按顺序分述如下:
pid %d
进程标识.
comm %s
可执行文件的文件名, 包括路径. 该文件是否可见取决于该文件是否已被交换出内存.
state %c
";RSDZT"; 中的一个, R 是正在运行, S 是在可中断的就绪态中睡眠, D
是在不可中断的等待或交换态中睡眠, Z 是僵死, T
是被跟踪或被停止(由于收到信号).
ppid %d
父进程 PID.
pgrp %d
进程的进程组 ID.
session %d
进程的会话 ID.
tty %d
进程所使用终端.
tpgid %d
当前拥有该进程所连接终端的进程所在的进程组 ID.
flags %u
进程标志. 目前每个标志都设了数学位, 所以输出里就不包括该位. crt0.s
检查数学仿真这可能是一个臭虫, 因为不是每个进程都是用 c 编译的程序.
数学位应该是十进制的 4, 而跟踪位应该是十进制的 10.
minflt %u
进程所导致的小错误(minor faults)数目, 这样的小错误(minor
faults)不需要从磁盘重新载入一个内存页.
cminflt %u
进程及其子进程所导致的小错误(minor faults)数目.
majflt %u
进程所导致的大错误(major faults)数目, 这样的大错误(major
faults)需要重新载入内存页.
cmajflt %u
进程及其子进程所导致的大错误(major faults)数目.
utime %d
进程被调度进用户态的时间(以 jiffy 为单位, 1 jiffy=1/100
秒,另外不同硬件体系略有不同).
stime %d
进程被调度进内核态的时间, 以 jiffy 为单位.
cutime %d
进程及其子进程被调度进用户态的时间, 以 jiffy 为单位.
cstime %d
进程及其子进程被调度进内核态的时间, 以 jiffy 为单位.
counter %d
如果进程不是当前正在运行的进程, 就是进程在下个时间片当前可以拥有的最大时间,
以 jiffy 为单位. 如果进程是当前正在运行的进程, 就是当前时间片中所剩下 jiffy
数目.
priority %d
标准优先数只再加上 15, 在内核里该值总是正的.
timeout %u
当前至进程的下一次间歇时间, 以 jiffy 为单位.
itrealvalue %u
由于计时间隔导致的下一个 SIGALRM 发送进程的时延,以 jiffy 为单位.
starttime %d
进程自系统启动以来的开始时间, 以 jiffy 为单位.
vsize %u
虚拟内存大小.
rss %u
Resident Set Size(驻留大小): 进程所占用的真实内存大小, 以页为单位,
为便于管理而减去了 3. rss 只包括正文, 数据以及堆栈的空间,
但不包括尚未要求装入内存的或已被交换出去的.
rlim %u
当前进程的 rss 限制, 以字节为单位, 通常为 2,147,483,647.
startcode %u
正文部分地址下限.
endcode %u
正文部分地址上限.
startstack %u
堆栈开始地址.
kstkesp %u
esp(32 位堆栈指针) 的当前值, 与在进程的内核堆栈页得到的一致.
kstkeip %u
EIP(32 位指令指针)的当前值.
signal %d
待处理信号的 bitmap(通常为 0).
blocked %d
被阻塞信号的 bitmap(对 shell 通常是 0, 2).
sigignore %d
被忽略信号的 bitmap.
sigcatch %d
被俘获信号的 bitmap.
wchan %u
进程在其中等待的通道, 实际是一个系统调用的地址. 如果你需要文本格式的,
也可以在名字列表中找到. (如果有最新版本的 /etc/psdatabase, 你可以在 ps -l
的结果中的 WCHAN 域看到)
cpuinfo
保存了CPU 以及体系架构依赖条目的列表. 对于不同的系统架构有不同的列表,
共有的两项是 cpu 和 BogoMIPS, cpu 可能是当前在用的 CPU, 而 BogoMIPS
则是内核初始化时计算出的一个系统常数.
devices
主设备号及设备组的列表, 文本格式. MAKEDEV 脚本使用该文件来维持内核的一致性.
Section: ;Linux Programmer's Manual; (5)
Updated: ;22 July 1996;
Index Return to Main Contents
--------------------------------------------------------------------------------
NAME [名字]
proc - 进程信息伪文件系统
描述
/proc 是一个伪文件系统, 被用作内核数据结构的接口, 而不仅仅是解释说明
/dev/kmem. /proc里的大多数文件都是只读的,
但也可以通过写一些文件来改变内核变量.
下面对整个 /proc 目录作一个大略的介绍.
[number]
在 /proc 目录里, 每个正在运行的进程都有一个以该进程 ID 命名的子目录,
其下包括如下的目录和伪文件.
cmdline
该文件保存了进程的完整命令行. 如果该进程已经被交换出内存,
或者该进程已经僵死, 那么就没有任何东西在该文件里,
这时候对该文件的读操作将返回零个字符. 该文件以空字符 null
而不是换行符作为结束标志.
cwd
一个符号连接, 指向进程当前的工作目录. 例如, 要找出进程 20 的 cwd, 你可以:
cd /proc/20/cwd; /bin/pwd
请注意 pwd 命令通常是 shell 内置的, 在这样的情况下可能工作得不是很好.
environ
该文件保存进程的环境变量, 各项之间以空字符分隔, 结尾也可能是一个空字符.
因此, 如果要输出进程 1 的环境变量, 你应该:
(cat /proc/1/environ; echo) | tr ";00"; ";n";
(至于为什么想要这么做, 请参阅 lilo(8).)
exe
也是一个符号连接, 指向被执行的二进制代码. 在 Linux 2.0 或者更早的版本下, 对
exe 特殊文件的 readlink(2) 返回一个如下格式的字符串: [设备号]:节点号
举个例子, [0301]:1502 就是某设备的 1502 节点, 该设备的主设备号为 03 (如
IDE, MFM 等驱动器), 从设备号为 01 (第一个驱动器的第一分区). 而在 Linux 2.2
下, readlink(2) 则给出命令的实际路径名. 另外,
该符号连接也可以正常析引用(试图打开 exe 文件实际上将打开一个可执行文件).
你甚至可以键入 /proc/[number]/exe 来运行 [number] 进程的副本. 带 -inum
选项的 find(1) 命令可以定位该文件.
fd
进程所打开的每个文件都有一个符号连接在该子目录里, 以文件描述符命名,
这个名字实际上是指向真正的文件的符号连接,(和 exe 记录一样).例如, 0
是标准输入, 1 是标准输出, 2 是标准错误, 等等.
程序有时可能想要读取一个文件却不想要标准输入,或者想写到一个文件却不想将输出送
到标准输出去,那么就可以很有效地用如下的办法骗过(假定 -i 是输入文件的标志,
而 -o 是输出文件的标志):
foobar -i /proc/self/fd/0 -o /proc/self/fd/1 ...
这样就是一个能运转的过滤器. 请注意该方法不能用来在文件里搜索, 这是因为 fd
目录里的文件是不可搜索的. 在 UNIX 类的系统下, /proc/self/fd/N 基本上就与
/dev/fd/N 相同. 实际上, 大多数的 Linux MAKEDEV 脚本都将 /dev/fd 符号连接到
[..]/proc/self/fd 上.
maps
该文件包含当前的映象内存区及他们的访问许可. 格式如下:
address perms offset dev inode
00000000-0002f000 r-x-- 00000400 03:03 1401
0002f000-00032000 rwx-p 0002f400 03:03 1401
00032000-0005b000 rwx-p 00000000 00:00 0
60000000-60098000 rwx-p 00000400 03:03 215
60098000-600c7000 rwx-p 00000000 00:00 0
bfffa000-c0000000 rwx-p 00000000 00:00 0
address 是进程所占据的地址空间, perms 是权限集:
r = read
w = write
x = execute
s = shared
p = private (copy on write)
offset 是文件或者别的什么的偏移量, dev 是设备号(主设备号:从设备号), 而
inode 则是设备的节点号. 0 表明没有节点与内存相对应, 就象 bss 的情形.
在 Linux 2.2 下还增加了一个域给可用的路径名.
mem
该文件并不是 mem (1:1) 设备, 尽管它们有相同的设备号. /dev/mem
设备是做任何地址转换之前的物理内存, 而这里的 mem
文件是访问它的进程的内存.目前这个 mem 还不能 mmap(2)
(内存映射)出去,而且可能一直要等到内核中增加了一个通用的 mmap(2)
以后才能实现. (也许在你读本手册页时这一切已经发生了)
mmap
mmap(2) 做的 maps 映射目录,是和 exe, fd/* 等类似的符号连接. 请注意 maps
包含了比 /proc/*/mmap 更多的信息, 所以应该废弃 mmap. ";0"; 通常指
libc.so.4. 在 linux 内核 1.1.40 里, /proc/*/mmap 被取消了. (现在是 真的
废弃不用了!)
root
依靠系统调用 chroot(2), unix 和 linux 可以让每个进程有各自的文件系统根目录.
由 chroot(2) 系统调用设置.根指向文件系统的根,性质就象 exe, fd/* 等一样.
stat
进程状态信息, 被命令 ps(1) 使用. 现将该文件里各域, 以及他们的 scanf(3)
格式说明符, 按顺序分述如下:
pid %d
进程标识.
comm %s
可执行文件的文件名, 包括路径. 该文件是否可见取决于该文件是否已被交换出内存.
state %c
";RSDZT"; 中的一个, R 是正在运行, S 是在可中断的就绪态中睡眠, D
是在不可中断的等待或交换态中睡眠, Z 是僵死, T
是被跟踪或被停止(由于收到信号).
ppid %d
父进程 PID.
pgrp %d
进程的进程组 ID.
session %d
进程的会话 ID.
tty %d
进程所使用终端.
tpgid %d
当前拥有该进程所连接终端的进程所在的进程组 ID.
flags %u
进程标志. 目前每个标志都设了数学位, 所以输出里就不包括该位. crt0.s
检查数学仿真这可能是一个臭虫, 因为不是每个进程都是用 c 编译的程序.
数学位应该是十进制的 4, 而跟踪位应该是十进制的 10.
minflt %u
进程所导致的小错误(minor faults)数目, 这样的小错误(minor
faults)不需要从磁盘重新载入一个内存页.
cminflt %u
进程及其子进程所导致的小错误(minor faults)数目.
majflt %u
进程所导致的大错误(major faults)数目, 这样的大错误(major
faults)需要重新载入内存页.
cmajflt %u
进程及其子进程所导致的大错误(major faults)数目.
utime %d
进程被调度进用户态的时间(以 jiffy 为单位, 1 jiffy=1/100
秒,另外不同硬件体系略有不同).
stime %d
进程被调度进内核态的时间, 以 jiffy 为单位.
cutime %d
进程及其子进程被调度进用户态的时间, 以 jiffy 为单位.
cstime %d
进程及其子进程被调度进内核态的时间, 以 jiffy 为单位.
counter %d
如果进程不是当前正在运行的进程, 就是进程在下个时间片当前可以拥有的最大时间,
以 jiffy 为单位. 如果进程是当前正在运行的进程, 就是当前时间片中所剩下 jiffy
数目.
priority %d
标准优先数只再加上 15, 在内核里该值总是正的.
timeout %u
当前至进程的下一次间歇时间, 以 jiffy 为单位.
itrealvalue %u
由于计时间隔导致的下一个 SIGALRM 发送进程的时延,以 jiffy 为单位.
starttime %d
进程自系统启动以来的开始时间, 以 jiffy 为单位.
vsize %u
虚拟内存大小.
rss %u
Resident Set Size(驻留大小): 进程所占用的真实内存大小, 以页为单位,
为便于管理而减去了 3. rss 只包括正文, 数据以及堆栈的空间,
但不包括尚未要求装入内存的或已被交换出去的.
rlim %u
当前进程的 rss 限制, 以字节为单位, 通常为 2,147,483,647.
startcode %u
正文部分地址下限.
endcode %u
正文部分地址上限.
startstack %u
堆栈开始地址.
kstkesp %u
esp(32 位堆栈指针) 的当前值, 与在进程的内核堆栈页得到的一致.
kstkeip %u
EIP(32 位指令指针)的当前值.
signal %d
待处理信号的 bitmap(通常为 0).
blocked %d
被阻塞信号的 bitmap(对 shell 通常是 0, 2).
sigignore %d
被忽略信号的 bitmap.
sigcatch %d
被俘获信号的 bitmap.
wchan %u
进程在其中等待的通道, 实际是一个系统调用的地址. 如果你需要文本格式的,
也可以在名字列表中找到. (如果有最新版本的 /etc/psdatabase, 你可以在 ps -l
的结果中的 WCHAN 域看到)
cpuinfo
保存了CPU 以及体系架构依赖条目的列表. 对于不同的系统架构有不同的列表,
共有的两项是 cpu 和 BogoMIPS, cpu 可能是当前在用的 CPU, 而 BogoMIPS
则是内核初始化时计算出的一个系统常数.
devices
主设备号及设备组的列表, 文本格式. MAKEDEV 脚本使用该文件来维持内核的一致性.
|
man proc
|
你想了解什么,说的再明白些