在Linux下面,编写类似的资源管理器,需要读取proc下面的很多文件,为此,搜寻了下面的资料,以利于学习和保存!
总之,可以使用命令来读取cat /proc/pid/stat(读取进程信息…………)
=============================================================================
/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 ";\000"; ";\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 脚本使用该文件来维持内核的一致性.
- dma
- 一个列表, 指出正在使用的 ISA DMA (直接内存访问)通道.
- filesystems
- 以文本格式列出了被编译进内核的文件系统. 当没有给 mount(1) 指明哪个文件系统的时候, mount(1) 就依靠该文件遍历不同的文件系统.
- interrupts
- 该文件以 ASCII 格式记录了(至少是在 i386 体系上的)每次 IRQ 的中断数目.
- ioports
- 该文件列出了当前在用的已注册 I/O 端口范围.
- kcore
-
该伪文件以 core 文件格式给出了系统的物理内存映象, 再利用未卸载的内核 (/usr/src/linux/tools/zSystem), 我们就可以用 GDB 查探当前内核的任意数据结构.
该文件的总长度是物理内存 (RAM) 的大小再加上 4KB.
- kmsg
-
可以用该文件取代系统调用
syslog(2) 来记录内核信息. 但是读该文件需要超级用户权限, 并且一次只能有一个进程可以读该文件, 因而如果一个使用了
syslog(2) 系统调用功能来记录内核信息的系统日志进程正在运行的话, 别的进程就不能再去读该伪文件了.
该文件的内容可以用 dmesg(8) 来察看.
- ksyms
-
该文件保存了内核输出的