/proc文件系统

在较老的UNIX实现中,通常并无简单方法来获取(或修改)内核属性。为了提供更为简便的方法来访问内核信息,许多现代UNIX实现提供了一个/proc虚拟文件系统,其包含了各种用于展示内核信息的文件。之所以将其称为虚拟,是因为其包含的文件和子目录并未存储在磁盘上,而是由内核在进程访问此类信息时动态创建而成。

获取与进程有关的信息:/proc/PID

对于系统中每个进程,内核都提供了相应的目录,命名为/proc/PID,其中PID是进程的 ID。在此目录中的各种文件和子目录包含了进程的相关信息。

每个/proc/PID目录下的文件节选:

文件描述
cmdline\0分割的命令行参数
cwd指向当前工作目录的符号链接
EnvironNAME=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目录下的各种文件和子目录提供了对系统级信息的访问。
Excerpts_from_the_proc_directory.png

节选/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()系统调用

标签: Linux, C/C++, TLPI

添加新评论