新闻  |   论坛  |   博客  |   在线研讨会
嵌入式Linux:proc文件系统
美男子玩编程 | 2024-08-22 10:52:34    阅读:61   发布文章

proc 文件系统是一个虚拟文件系统,它以文件系统的形式为应用层提供访问系统内核数据的接口。用户和应用程序可以通过 proc 文件系统获取系统信息和进程相关信息,对 proc 文件系统的读写相当于与内核进行通信。然而,与普通文件不同,proc 文件系统是动态创建的,文件本身并不存在于磁盘中,只存在于内存中。因此,它被称为虚拟文件系统,类似于 devfs。

proc 文件系统特点如下:

  • 动态创建proc 文件系统中的文件是动态生成的,实时反映系统和进程的状态。

  • 内核信息访问最初,proc 文件系统是为了提供有关系统中进程的信息,但由于其高效和便捷,很多内核信息也开始通过它进行报告或启用动态运行时配置。

  • 可视化数据内核将运行时的一些关键数据以文件的形式呈现在 proc 文件系统的特定文件中,使得应用层可以以可视化方式访问这些数据结构。

proc 文件系统通常挂载在系统的 /proc 目录下。对于内核开发者(如驱动开发工程师)来说,proc 文件系统提供了一种调试内核的方法:通过查看 /proc/xxx 文件,可以获取内核特定数据结构的值,对比添加新功能前后的数据变化,从而判断该功能的影响是否合理。

在 /proc 目录下包含了一些重要的目录和虚拟文件如下所示:


图片


在 /proc 目录下,可以看到许多以数字命名的文件夹,例如 100038、2299、98560 等。这些数字对应的是各个进程的 PID(进程标识符)。每个进程在内核中都有一个唯一的编号,即 PID,用来区分不同的进程。这些以数字命名的文件夹中记录了各个进程的相关信息。不同的信息通过不同的虚拟文件呈现。

以下是对 /proc 目录下各个文件和子目录的详细说明:

进程相关信息

  • /proc/[pid]每个正在运行的进程都有一个对应的目录,[pid] 是进程的 ID,包含了关于该进程的各种信息。

    • /proc/[pid]/cmdline启动该进程的命令行参数。

    • /proc/[pid]/cwd指向进程当前的工作目录的符号链接。

    • /proc/[pid]/environ进程的环境变量。

    • /proc/[pid]/exe指向进程的可执行文件的符号链接。

    • /proc/[pid]/fd/包含指向进程打开的文件描述符的符号链接。

    • /proc/[pid]/stat进程的状态信息,包含进程的详细状态。

    • /proc/[pid]/status进程的状态信息,以更易读的格式显示。

系统相关信息

  • /proc/cpuinfo关于 CPU 的详细信息,包括每个 CPU 的型号、频率、缓存大小等。

  • /proc/meminfo关于系统内存的详细信息,包括总内存、可用内存、缓存大小等。

  • /proc/uptime系统启动后的时间和空闲时间。

  • /proc/version内核版本信息,包括编译者和编译时间。

  • /proc/loadavg系统负载平均值,显示最近 1、5、15 分钟的系统平均负载。

  • /proc/filesystems内核支持的文件系统列表。

  • /proc/sys/内核参数的配置,通过该目录可以调整和查看内核参数。

其他有用的虚拟文件

  • /proc/cmdline内核启动参数。

  • /proc/iomemIO 设备的内存使用情况。

  • /proc/interrupts显示被占用的中断号和占用者相关的信息。

  • /proc/ioportsIO 端口的使用情况。

  • /proc/kcore系统物理内存映像,不可读取,一般用于内核调试。

  • /proc/loadavg系统平均负载。

  • /proc/meminfo物理内存和交换分区使用情况。

  • /proc/modules当前加载的内核模块列表。

  • /proc/mounts当前挂载的文件系统列表。

  • /proc/partitions系统识别的分区表。

  • /proc/swaps交换分区的利用情况。

  • /proc/version内核版本信息。

  • /proc/uptime系统运行时间。

1

使用 cat 命令读取 /proc 文件系统

cat 命令是一个简单且常用的方式来读取 /proc 目录下的虚拟文件。

查看内核版本:


cat /proc/version

输出类似于:


Linux version 5.4.0-42-generic (buildd@lgw01-amd64-040) (gcc version 9.3.0 (Ubuntu 9.3.0-10ubuntu2)) #46-Ubuntu SMP Fri Jul 10 00:24:02 UTC 2020

查看系统负载:


cat /proc/loadavg

输出类似于:


0.00 0.01 0.05 1/103 1234

2

在应用程序中使用open()和read()函数读取/proc文件系统

在编程中,可以使用标准的文件操作函数来读取 /proc 文件系统中的内容。以下是一个简单的 C 程序示例:


#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <unistd.h> #define BUFFER_SIZE 1024 void read_proc_file(const char *filepath) {    int fd = open(filepath, O_RDONLY);    if (fd == -1) {        perror("open");        exit(EXIT_FAILURE);    }     char buffer[BUFFER_SIZE];    ssize_t bytesRead;    while ((bytesRead = read(fd, buffer, sizeof(buffer) - 1)) > 0) {        buffer[bytesRead] = '';        printf("%s", buffer);    }     if (bytesRead == -1) {        perror("read");        close(fd);        exit(EXIT_FAILURE);    }     close(fd);} int main() {    read_proc_file("/proc/version");    return 0;}

输出类似于:


Linux version 5.4.0-42-generic (buildd@lgw01-amd64-040) (gcc version 9.3.0 (Ubuntu 9.3.0-10ubuntu2)) #46-Ubuntu SMP Fri Jul 10 00:24:02 UTC 2020

通过 cat 命令和编程接口,用户和开发者可以方便地访问和读取 /proc 文件系统中的实时信息。这些信息对于系统监控、调试和优化非常有用。


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客