1.本章介绍通过/proc文件系统获取系统和进程的一些信息。还介绍了uname()系统调用,用于获取各种系统标识。
2./proc文件系统:
Linux系统提供了/proc虚拟文件系统,用来给用户层提供系统内核和进程的一些信息,并提供普通文件的IO访问方式。该虚拟文件系统不是存储在硬盘上,而是随程序的运行自动创建和消除的虚拟文件。
a./proc/PID目录
对于系统中的每个进程,都提供了相应的目录,命名为/proc/PID,PID就是进程的ID。例如通过命令
cat /proc/1/status
就可以获取init进程的状态信息。该信息通过该目录下status文件传递。PID目录下还有一些其他文件:
cmdline(已\0分隔的命令行参数), cwd(指向当前工作目录的符号链接), Environ(NMAE=value键值对的环境变量),exe(指向正在执行文件的符号链接), fd(包含了指向由进程打开的文件描述符的符号链接), maps(内存映射),mem(进程虚拟内存), mounts(进程的安装点),root(指向根目录的符号链接), status(各种信息,包括进程id,凭证,内存使用量,信号), task(为进程中的每个线程包含一个子目录)
b./proc/PID/fd目录
该目录包含了该进程打开的文件描述符fd的符号链接,每个符号链接的名称都与描述符的数值相匹配。例如/proc/1968/1是ID为1968的进程的指向标准输出的符号链接。
c.线程 /proc/PID/task目录:
针对进程中的每个线程,内核提供了以/proc/PID/task/TID命名的子目录,其中TID为线程的id,通过gettid()函数获得。每个该目录下包含了一套类似于/proc/PID目录内容的文件和目录,用来提供各个线程的信息,因为同一个进程的各个线程共享很多资源,所以,很多信息是相同的。
3、/proc目录下还提供了很多目录用来提供各种信息,比如
/proc, /proc/net(有关网络和socket的状态信息) , /proc/sys/fs(文件系统的相关设置), /proc/sys/kernel(各种常规的内核设置), /proc/sys/net(网络和socket的设置), /proc/sys/vm(内存管理设置), /proc/sysvipc(有关system v IPC对象的信息)
4.访问/proc文件:
在脚本中可以利用echo 和cat命令来修改和读取文件内容
#echo 10000 > /proc/sys/kernel/pid_max
#cat /proc/sys/kernel/pid_max
程序中利用常规的ID借口来访问,但是要注意,很多文件是只读的。
5.uname()系统调用:
#include <sys/utsname.h>
int uname(struct utsname *utsbuf);
struct utsname {
char sysname[_UTSNAME_LENGTH];//Implementation name
char nodename[_UTSNAME_LENGTH];//Node name on network
char release[_UTSNAME_LENGTH];//Implementation version level
char version[_UTSNAME_LENGTH];//Release version level
char machine[_UTSNAME_LENGTH];//Hardware on which system is running
char domainname[_UTSNAME_LENGTH];//NIS domain name of host
}