proc文件系统

简介: 版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/45096939 proc文件系统是一个虚拟的文件系统,用使用man proc命令上对proc的描述来说就是一个伪文件系统,它提供了一些内核数据结构的接口。
版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/45096939

proc文件系统是一个虚拟的文件系统,用使用man proc命令上对proc的描述来说就是一个伪文件系统,它提供了一些内核数据结构的接口。通常该文件系统被挂载在/proc目录下,通常情况下他是只读的,但是一些文件也允许一些内核变量去修改。

下面我列举几个例子:

//获取CPU的信息
cat /proc/couinfo

这里是我的一些输出:
这里写图片描述

//获取内存信息
cat /proc/meminfo

下面是输出:
这里写图片描述

proc文件系统中还有很多可以获取一些有用信息的文件
可以使用man proc对proc文件系统进行一个整体的了解。

下面基于对proc文件系统的了解,我使用C语言来获取当前系统中的一些信息,包括:
| 问题A |
| 1:CPU类型 |
| 2:内核版本 |
| 问题B |
| 1:系统运行时间 |
| 问题C |
| 1:cpu状态 |
| 2:磁盘请求数 |
| 3:上下文切换次数 |
| 4:进程总数 |
| 问题D |
| 1:内存总量 |
| 2:可用内存 |
| 3:系统平均负荷 |

下面是我的代码:

/**********************************************
    Function
    : 观察 linux 内核行为
/***********************************************/

#include <stdio.h>
#include <sys/time.h>
#include <string.h>
#include <stdlib.h>

//文件指针,用于读取proc文件系统中的一些文件
FILE *thisProcFile;  

//获取CPU类型
void CPUinfo()
{
    char s[1000];
    char gu[10] = "model name";

    //打开文件并进行读取
    if((thisProcFile = fopen("/proc/cpuinfo","r")) == NULL)
    {
        printf("%s\n","Open file failed!!");
        exit(0);    
    }

    while(fgets(s,100,thisProcFile) != NULL)
    {
        char *temp = strtok(s,":");

        if(strncmp(s,gu,10) == 0)
        {
            //以":"为分割符将字符串分割开来
            temp = strtok(NULL,":");
            printf("CPU类型: %s\n",temp);

            fclose(thisProcFile);
            return;
        }
    }


}

//获取内核版本
void Kernel_version()
{
    char s[1000];

    if((thisProcFile = fopen("/proc/version","r")) == NULL)
    {
        printf("%s\n","Open file failed!!");
        exit(0);    
    }

    printf("内核版本信息为: \n");
    while(!feof(thisProcFile))
    {
        if(fgets(s,100,thisProcFile) != NULL)
            printf("%s",s);
    }

    fclose(thisProcFile);

}

//获取系统运行时间
void time_run()
{
    char s[100];

    if((thisProcFile = fopen("/proc/uptime","r")) == NULL)
    {
        printf("%s\n","Open file failed!!");
        exit(0);    
    }

    if(fgets(s,100,thisProcFile) != NULL)
    {
        char *temp = strtok(s," ");
        int times = atoi(temp);

        //进行时间的转换
        int run_days = times / 86400;
        int run_hours = (times % 86400) / 3600;
        int run_minutes = (times % 3600) / 60;
        int run_seconds = (times % 60);
        printf("系统运行时间为: %d天%d时%d分%d秒\n",run_days,run_hours,run_minutes,run_seconds);
    }

    fclose(thisProcFile);
}


void sampleLoadAvg(){ //观察系统负荷
    char s[100];
    if((thisProcFile = fopen("/proc/loadavg","r")) == NULL)
    {
        printf("%s\n","Open file failed!!");
        exit(0);    
    }

    fgets(s,100,thisProcFile);

    fclose(thisProcFile);

    char *temp = strtok(s," ");

    char *array[5];
    int m = 0;
    while(temp != NULL){
        array[m] = temp;
        temp = strtok(NULL," ");
        m++;
    }

    printf("一分钟之内的平均进程数为: %s\n",array[0]);
    printf("五分钟之内的平均进程数为: %s\n",array[1]);
    printf("十五分钟之内的平均进程数为: %s\n",array[2]);
    printf("正在运行进程数/进程总数: %s\n",array[3]);
    printf("最近运行的进程ID: %s\n",array[4]);

    fclose(thisProcFile);
}

//获取CPU状态
void cpu_state()
{
    char s[1000];

    if((thisProcFile = fopen("/proc/stat","r")) == NULL)
    {
        printf("%s\n","Open file failed!!");
        exit(0);    
    }

    if(fgets(s,1000,thisProcFile) != NULL)
    {
        char *temp = strtok(s," ");

        char *array[11];
        int m = 0;
        while(temp != NULL){
            array[m] = temp;
            temp = strtok(NULL," ");
            m++;
        }

        printf("CPU执行用户态所用的时间: %s jiffies\n",array[1]);
        printf("CPU执行系统态所用的时间: %s jiffies\n",array[3]);
        printf("CPU执行空闲态所用的时间: %s jiffies\n",array[4]);
    }

    fclose(thisProcFile);
}

//获取上下文切换次数
void ctxt()
{
    char s[1000];
    char gu[4] = "ctxt";

    if((thisProcFile = fopen("/proc/stat","r")) == NULL)
    {
        printf("%s\n","Open file failed!!");
        exit(0);    
    }

    while(fgets(s,100,thisProcFile) != NULL)
    {
        char *temp = strtok(s," ");

        if(strncmp(s,gu,4) == 0)
        {
            temp = strtok(NULL," ");
            printf("上下文切换的次数为: %s\n",temp);

            fclose(thisProcFile);
            return;
        }
    }
}

//获取创建的进程数
void processes()
{
    char s[1000];
    char gu[9] = "processes";

    if((thisProcFile = fopen("/proc/stat","r")) == NULL)
    {
        printf("%s\n","Open file failed!!");
        exit(0);    
    }

    while(fgets(s,100,thisProcFile) != NULL)
    {
        char *temp = strtok(s," ");

        if(strncmp(s,gu,9) == 0)
        {
            temp = strtok(NULL," ");
            printf("创建的进程数为: %s\n",temp);

            fclose(thisProcFile);
            return;
        }
    }
}

//获取内存总量
void MemTotal()
{
    char s[100];
    char gu[8] = "MemTotal";

    if((thisProcFile = fopen("/proc/meminfo","r")) == NULL)
    {
        printf("%s\n","Open file failed!!");
        exit(0);    
    }

    while(fgets(s,100,thisProcFile) != NULL)
    {
        char *temp = strtok(s,":");

        if(strncmp(s,gu,8) == 0)
        {
            temp = strtok(NULL,":");
            printf("内存总量为: %s\n",temp);

            fclose(thisProcFile);
            return;
        }
    }
}

//获取活动内存
void MemFree()
{
    char s[100];
    char gu[7] = "MemFree";

    if((thisProcFile = fopen("/proc/meminfo","r")) == NULL)
    {
        printf("%s\n","Open file failed!!");
        exit(0);    
    }

    while(fgets(s,100,thisProcFile) != NULL)
    {
        char *temp = strtok(s,":");

        if(strncmp(s,gu,7) == 0)
        {
            temp = strtok(NULL,":");
            printf("可用内存为: %s\n",temp);

            fclose(thisProcFile);
            return;
        }
    }
}


int main(int argc,char *argv[])
{
    //sampleLoadAvg();  均衡负载
    //CPUinfo(); // CPU信息
    //Kernel_version();  //内核版本信息

    //time_run(); //获取系统运行时间
    //cpu_state();  //获取CPU状态
    //ctxt();
    //processes();
    //MemTotal();
    //MemFree();

    char in;

    printf("=========================================\n");
    printf("|     请输入要查看的问题:                |\n");
    printf("|     问题A                              |\n");
    printf("|       1:CPU类型                       |\n");
    printf("|       2:内核版本                      |\n");
    printf("|     问题B                              |\n");
    printf("|       1:系统运行时间                  |\n");
    printf("|     问题C                              |\n");
    printf("|       1:cpu状态                       |\n");
    printf("|       2:磁盘请求数                    |\n");
    printf("|       3:上下文切换次数                |\n");
    printf("|       4:进程总数                     |\n");
    printf("|     问题D                             |\n");
    printf("|       1:内存总量                     |\n");
    printf("|       2:可用内存                     |\n");
    printf("|       3:系统平均负荷                 |\n");
    printf("=========================================\n");

    scanf("%c",&in);
    if(in == 'A'){
        CPUinfo();
        Kernel_version();  //内核版本信息
    }else if(in == 'B'){
        time_run(); //获取系统运行时间
    }else if(in == 'C'){
        cpu_state();  //获取CPU状态
        ctxt();
        processes();
    }else if(in == 'D'){
        MemTotal();  //内存总量
        MemFree();  //可用内存
        sampleLoadAvg();  //系统平均负载
    }
}

下面是我的几个输出截图:

程序运行提示
查看CPU类型和内核版本
查看系统运行时间
查看问题C
查看问题D

目录
相关文章
|
2月前
|
存储 安全 Linux
sysfs - 用于导出内核对象的_文件系统 【ChatGPT】
sysfs - 用于导出内核对象的_文件系统 【ChatGPT】
|
存储 缓存 Linux
sysfs文件系统(1)
sysfs是一种虚拟文件系统,旨在提供一种访问内核数据结构的方法,从而允许用户空间程序查看和控制系统的设备和资源。sysfs文件系统通常被挂载在/sys目录下。sysfs提供了一种以树状结构组织的系统信息的方式,其中每个设备都有一个唯一的目录来表示它自己,其中包含有关设备的各种属性和状态信息的文件。这些文件通常是只读的,但有些也可以用于修改设备的某些设置。sysfs还提供了一个机制来通知用户空间程序有关设备状态更改的信息,从而使其能够对这些更改做出反应。sysfs文件系统被广泛用于Linux内核中,它为开发者提供了一种简单的方式来管理和控制系统中的各种设备和资源。
198 0
|
6月前
|
存储 数据可视化 Linux
proc文件系统怎么玩?
proc文件系统怎么玩?
94 0
|
存储 缓存 Linux
从 lsof 开始,深入理解虚拟文件系统
从 lsof 开始,深入理解虚拟文件系统
79 0
|
Linux 程序员 Shell
sysfs文件系统与kobject
sysfs文件系统与kobject
163 0
|
前端开发 Linux
Linux进程管理作业控制及虚拟文件系统
作业控制是一个命令行功能,也叫后台运行。
92 0
|
Unix Linux 容器
sysfs文件系统(2)
每个内核设备直接或间接嵌入kobject属性。在添加到系统之前,必须使用kobject_ create()函数分配kobject,并将已经分配但尚未初始化的kob ject指针及其kobject_type 指针作为参数。kobject_add()函数用于添加kobject并将其链接到系统,同时根据其层次结构创建目录及其默认属性。功能与之相反的函数是kobject_ del(),将kobject删除链接
119 0
|
缓存 Linux Shell
虚拟文件系统
Linux内核中的虚拟文件系统用来管理挂接各种具体文件系统。具体的文件系统可设计成可加载模块,在系统需要时进行加载。 挂载具体文件系统时,VFS读取它的超级块,得到具体文件系统的拓扑结构,并将这些信息映射到VFS超级块结构中。
1011 1