【TLPI读书笔记】 十二、系统和进程信息
/proc
文件系统
在较老的UNIX实现中,通常并无简单方法来获取(或修改)内核属性。为了提供更为简便的方法来访问内核信息,许多现代UNIX实现提供了一个/proc
虚拟文件系统,其包含了各种用于展示内核信息的文件。之所以将其称为虚拟,是因为其包含的文件和子目录并未存储在磁盘上,而是由内核在进程访问此类信息时动态创建而成。
获取与进程有关的信息:/proc/PID
对于系统中每个进程,内核都提供了相应的目录,命名为/proc/PID
,其中PID
是进程的 ID。在此目录中的各种文件和子目录包含了进程的相关信息。
每个/proc/PID
目录下的文件节选:
文件 | 描述 |
---|---|
cmdline | 以\0 分割的命令行参数 |
cwd | 指向当前工作目录的符号链接 |
Environ | NAME=value 键值对环境列表,以\0 分割 |
exe | 指向正在执行文件的符号链接 |
fd | 文件目录,包含了指向由进程打开文件的符号链接 |
maps | 内存映射 |
mem | 进程虚拟内存(在I/O操作之前必须调用lseek() 移至有效偏移量) |
mounts | 进程的安装点 |
root | 指向根目录的符号链接 |
status | 各种信息(比如进程ID、凭证、内存使用量、信号) |
task | 为进程中的每个线程均包含一个子目录(始于Linux2.6) |
/proc/PID/fd
目录
该目录为进程打开的每个文件描述符都包含了一个符号链接,每个符号链接的名称都与描述符的数值相匹配。- 线程:
/proc/PID/task
目录
针对进程中的每个线程,内核提供了以/proc/PID/task/TID
命名的子目录,其中TID
是线程的线程 ID。
每个/proc/PID/task/TID
子目录中的都有一套类似于/proc/PID
目录内容的文件和目录。
/proc
目录下的系统信息
/proc
目录下的各种文件和子目录提供了对系统级信息的访问。
节选/proc
子目录的用途:
目录 | 目录中文件表达的信息 |
---|---|
/proc | 各种系统信息 |
/proc/net | 有关网络和套接字的状态信息 |
/proc/sys/fs | 文件系统相关设置 |
/proc/sys/kernel | 各种常规的内核设置 |
/proc/sys/net | 网络和套接字的设置 |
/proc/sys/vm | 内存管理设置 |
/proc/sysvipc | 有关 System V IPC 对象的信息 |
访问/proc
文件
通常使用shell脚本来访问/proc
目录下的文件;也可以从程序中使用常规I/O系统调用来访问/proc
目录下的文件。但在访问这些文件时有如下限制:
/proc
目录下的一些文件是只读的,即这些文件仅用于显示内核信息,但无法对其进行修改。/proc
目录下的一些文件仅能由文件拥有者(或特权级进程)读取。- 除了
/proc/PID
子目录中的文件,/proc
目录的其他文件大多属于 root 用户,并且也仅有 root 用户能够修改那些可修改的文件。
访问/proc/PID
目录中的文件
要确定特定/proc/PID
目录的存在,就需要干净利落地处理如下可能性:当打开此目录下的文件时,进程已经终止,并且也已经删除了相应的/proc/PID
目录。
系统标识:uname()
uname()
系统调用返回了一系列关于主机系统的标识信息,存储于utsbuf
所指向的结构中。
#include <sys/utsname.h>
int uname(struct utsname *utsbuf);
Returns 0 on success, or -1 on error
参数
utsbuf
:是一个指向utsname
结构的指针,其定义如下:#define _UTSNAME_LENGTH 65 struct utsname { char sysname[_UTSNAME_LENGTH]; /* Implementation name */ char nodename[_UTSNAME_LENGTH]; /* Node name on network */ char release[_UTSNAME_LENGTH]; /* Implementation release level */ char version[_UTSNAME_LENGTH]; /* Release version level */ char machine[_UTSNAME_LENGTH]; /* Hardware on which system is running */ #ifdef _GNU_SOURCE /* Following is Linux-specific */ char domainname[_UTSNAME_LENGTH]; /* NIS domain name of host */ #endif };
返回值
- 成功:返回
0
- 失败:返回
-1
- 成功:返回
总结
本章主要介绍了获取系统和进程信息的方法,主要有两种:
/proc
文件系统uname()
系统调用