【Linux】程序中获取和设置cpu和mem相关信息

news2025/1/22 19:07:31

这里是目录

  • 一、CPU和MEM信息
    • 1.1、CPU信息
      • 1.1.1、CPU核心数
      • 1.1.2、CPU频率读取和调整
      • 1.1.3、CPU温度
    • 1.2、MEM信息
  • 二、C程序读取CPU和MEM信息
  • 三、测试

写在前面:
记录一下日常,之前有做过相关工作,但是没有记录下来,因此写一写文章。
本文主要用于在程序中获取CPU和内存的相关信息,比如:温度、CPU频率、内存使用、空闲等等。

一、CPU和MEM信息

1.1、CPU信息

找到下列目录,下列目录列出现了CPU相关的信息。
在这里插入图片描述

1.1.1、CPU核心数

cat /sys/devices/system/cpu/present

在这里插入图片描述

1.1.2、CPU频率读取和调整

频率需要分不同的核,当然每个不同的处理器不一样。可以结合自己的。这里举例cpu0。
下表所列为freq对应的参数,可以直接通过cat查看相关信息。
在这里插入图片描述
具体的内容含义可以参考:可以手动设置CPU的策略
链接: cpu频率相关详解

//修改cpu频率测量
echo powersave > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo conservative > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

performance // 性能
conservative //自动调整测策略--平滑
ondemand //自动调整--瞬时
//关闭cpu3,注意不能直接关闭cpu0,,,可以从最高的关闭3 2 1 
echo 0 > /sys/devices/system/cpu/cpu3/online

1.1.3、CPU温度

CPU温度在另外的地方查看,如下:
在这里插入图片描述
在这里插入图片描述

1.2、MEM信息

内存相关的信息如下:
这里都在
具体内容如下:
在这里插入图片描述
参考链接: meminfo详解

二、C程序读取CPU和MEM信息

device_info.c

#include "device_info.h"
#include "return_data.h"

void mem_info_fun (mem_info *m)
{
    FILE *fd;
    int n;
    char buff[256];

    fd = fopen ("/proc/meminfo", "r");

    //从fd文件中读取一行数据到buff
    fgets (buff, sizeof(buff), fd);
    //把buffer中的数据按照后面的格式存储到对应的地址中
    sscanf (buff, "%s %u", m->MemTotal, &m->mem_total);
    // printf("%s    %s %u\n", buff,m->MemTotal,m->mem_total);
    fgets (buff, sizeof(buff), fd);
    sscanf (buff, "%s %u", m->MemFree, &m->mem_free);
    fgets (buff, sizeof(buff), fd);
    sscanf (buff, "%s %u", m->MemAvailable, &m->mem_available);
    // printf("%s   %s %u \n", buff,m->MemAvailable, m->mem_available);

    m->mem_use_ratio =  ((m->mem_total*1.0f - m->mem_available*1.0f)/m->mem_total*1.0f) * 100;
    // printf("mem_ratio:%d \n",m->mem_ratio);

    fclose(fd);     //关闭文件fd
}

int cpu_info_fun(cpu_info *data)
{
    int ret = SUCCESS;
    FILE *fd;
    static uint8_t get_cpu_num = 0;
    char buff[100];
    char path_buff[100];


    fd = fopen ("/sys/devices/system/cpu/present", "r");
    if(NULL == fd)
    {
        perror("cpu_num fopen");
        return ERR_NULL;
    }
    //获取一行字符
    fgets (buff, sizeof(buff), fd);
    fclose(fd);     //关闭文件fd
    //把buffer中的数据按照后面的格式存储到对应的地址中
    sscanf (buff, "0-%hhu", &data->cpu_num);
    if(data->cpu_num >= CPU_MAX_NUM)
    {
        printf("cpu_info_fun error \n");
    }
    // printf("cpu_num:%u %s\n",data->cpu_num,path_buff);


    sprintf(path_buff, "/sys/devices/system/cpu/cpu%d/cpufreq/cpuinfo_cur_freq",get_cpu_num);
    // printf("path_buff:%s\n",path_buff);
    fd = fopen(path_buff, "r");
    if(NULL == fd)
    {
        perror("cpu_info_frep fopen");
        return ERR_NULL;
    }
    fgets (buff, sizeof(buff), fd);
    sscanf(buff, "%u", &data->cpu_cur_freq[get_cpu_num]);
    // printf("cpu_cur%d_freq:%u\n",get_cpu_num,data->cpu_cur_freq[get_cpu_num]);
    fclose(fd);     //关闭文件fd
    if(get_cpu_num++ >= data->cpu_num)
    {
        get_cpu_num = 0;
    }

    uint32_t temp = 0;
    fd = fopen("/sys/class/thermal/thermal_zone0/temp", "r");
    if(NULL == fd)
    {
        perror("cpu_info_temp fopen");
        return ERR_NULL;
    }
    fgets (buff, sizeof(buff), fd);
    sscanf(buff, "%u", &temp);
    fclose(fd);     //关闭文件fd
    data->cpu_cur_temp = temp / 100;
    // printf("temp:%u\n",data->cpu_cur_temp);

    return ret;
}

int get_mem_info(mem_info *mem_data)
{
    if(NULL == mem_data)
    {
        printf("get_device_info null\n");
        return ERR_NULL;
    }
    //获取内存
    mem_info_fun(mem_data);
    return SUCCESS;
}

int get_cpu_info(cpu_info *mem_data)
{
    if(NULL == mem_data)
    {
        printf("get_cpu_info null\n");
        return ERR_NULL;
    }
    //获取内存
    cpu_info_fun(mem_data);
    return SUCCESS;
}

int get_device_info_ioctrol(uint8_t num, void *data)
{
    int ret = SUCCESS;
    if(NULL == data)
    {
        printf("get_device_info_ioctrol null \r\n");
        return ERR_NULL;
    }
    switch (num)
    {
    case DEVICE_CPU_INFO:
        {
            ret |= get_cpu_info((cpu_info *)data);
            break;
        }
        break;
    case DEVICE_MEM_INFO:
        {
            ret |= get_mem_info((mem_info *)data);
            break;
        }
    default:
        break;
    }
    return ret;
}

device_info.h

#ifndef DEVICE_INFO_H
#define DEVICE_INFO_H

#include <stdio.h>
#include "stdint.h"

#define CPU_MAX_NUM 32

enum DEVICE_INFO
{
    DEVICE_CPU_INFO = 0,
    DEVICE_MEM_INFO,
    DEVICE_NUM_MAX
} device_info;// 最大参数

//定义一个mem_info的结构体
typedef struct _mem_info {
    char MemTotal[20];      //定义一个char类型的数组名name有20个元素
    uint32_t mem_total;
    char MemFree[20];
    uint32_t mem_free;
    char MemAvailable[20];
    uint32_t mem_available;
    uint8_t mem_use_ratio;
}mem_info;

//定义一个cpu_info的结构体
typedef struct _cpu_info {
    uint8_t cpu_num;
    int16_t cpu_cur_temp;
    uint32_t cpu_cur_freq[CPU_MAX_NUM];
}cpu_info;

int get_device_info_ioctrol(uint8_t num, void *data);
#endif

三、测试

参考上文的程序,自己获取显示即可。
参考之前的lvgl文章:【Linux】linux上使用lvgl
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/414077.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用hbuilder连接夜神模拟器调试app

1. Hbuilder设置 这里端口号随便用一个没有被占用的&#xff1b; 路径夜神模拟器的安装路径下的nox_adb.exe的路径。 2. 夜神模拟器设置 设置如下&#xff1a; 工具&#xff0c;设置&#xff0c;关于平板电脑&#xff08;这里应该没有开发者模式选项&#xff0c;这是我配好之…

【LeetCode】剑指 Offer 53. 在排序数组中查找数字 p263 -- Java Version

1. 题目介绍&#xff08;53. 在排序数组中查找数字&#xff09; 面试题53&#xff1a;在排序数组中查找数字 一共分为三小题&#xff1a; 题目一&#xff1a;数字在排序数组中出现的次数题目二&#xff1a;0 ~ n-1 中缺失的数字题目三&#xff1a;数组中数值和下标相等的元素 2…

【创作赢红包】面向对象基础概念

什么是面向对象 面向对象&#xff08;Object Oriented&#xff09;是软件开发方法&#xff0c;一种编程范式&#xff0c;它是一种对现实世界理解和抽象的方法&#xff0c;是计算机编程技术发展到一定阶段后的产物。 早期的计算机编程是基于面向过程的方法&#xff0c;如实现算…

前端工程化:环境准备—NodeJs安装-Vue项目开发流程

一、前端工程化-Yapi 介绍&#xff1a;YApi 是高效、易用、功能强大的 api 管理平台&#xff0c;旨在为开发、产品、测试人员提供更优雅的接口管理服务 地址&#xff1a; http://yapi.smart-xwork.cn/ 具体操作步骤&#xff1a; 1、添加项目 2、添加接口&#xff1a;根据ID查…

技术分享 | observer 资源水位介绍

作者&#xff1a;郭斌斌 爱可生 DBA 团队成员&#xff0c;负责项目日常问题处理及公司平台问题排查。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 OceanBase 集群界面会展示 Observer …

MATLAB绘制柱状/饼图填充图

MATLAB绘制柱状填充图方法1&#xff1a;hatchfill2工具1.1 案例1&#xff1a;柱状图填充1.2 案例2&#xff1a;饼图填充方法2&#xff1a;applyhatch函数2.1 案例1&#xff1a;柱状图填充2.2 案例2&#xff1a;饼图填充方法3&#xff1a; applyhatch_plusC函数3.1 案例1&#x…

Python 小型项目大全 31~35

三十一、猜数字 原文&#xff1a;http://inventwithpython.com/bigbookpython/project31.html 猜数字是初学者练习基本编程技术的经典游戏。在这个游戏中&#xff0c;电脑会想到一个介于 1 到 100 之间的随机数。玩家有 10 次机会猜出数字。每次猜中后&#xff0c;电脑会告诉玩…

Java实现ArrayList和底层源码讲解

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

Centos7安装MySQL5.7.30

文章目录1. 环境准备1.1 卸载mariadb1.2 下载MySQL 5.7.301.3 安装MySQL依赖项1.4 创建目录1.5 创建用户和用户组1.6 修改Mysql用户权限2. 安装MySQL2.1 解压2.2 修改解压目录名称2.3 初始化2.4 添加my.cnf异常找不到Sock文件2.5 启动MySQL服务2.5.1 建立软连接2.5.2 启动2.6 设…

TCP协议工作机制二(滑动窗口,流量控制,拥塞控制,延时应答,捎带应答等)

目录 滑动窗口 流量控制 拥塞控制 延时应答 捎带应答 面向字节流 异常情况 UDP和TCP对比 滑动窗口 由于TCP是可靠传输,有确认应答,超时重传,连接管理等机制,发送消息时需要等待接收方返回的ack.因此会消耗大量等待ack的时间,我们引入滑动窗口的机制来竭尽可能提高TCP的…

基于支持向量机的Digits手写数字识别

基于支持向量机的Digits手写数字识别 描述 支持向量机&#xff08;Support Vector Machine&#xff0c;简称SVM&#xff09;模型既可以用于分类也可以用于回归。手写数字识别是一个多分类问题&#xff08;判断一张手写数字图片是0~9中的哪一个&#xff09;&#xff0c;数据集…

图片英文翻译成中文转换器-中文翻译英文软件

您正在准备一份重要的英文资料或文件&#xff0c;但是您还不是很熟练地掌握英文&#xff0c;需要翻译才能完成您的任务吗&#xff1f;哪个软件能够免费把英文文档翻译成中文&#xff1f;让我们带您了解如何使用我们的翻译软件来免费翻译英文文档为中文。 我们的翻译软件是一款功…

C风格的字符串赋值方式

文章目录&#xff08;1&#xff09;C语言中&#xff0c;没有字符串类型但可以用字符数组模拟字符串。&#xff08;2&#xff09;C语言中&#xff0c;字符串是以’\0’作结尾字符。&#xff08;3&#xff09;C语言中&#xff0c;字符串常量本质上是一个无名的字符数组。C风格的字…

使用Spring JDBC中的JdbcTemplate对数据进行增删改查操作教程~

jdbcTemplate实现添加数据功能&#xff1a; spring框架对jdbc框架进行封装&#xff0c;使用jdbcTemplate方便实现对数据库的操作 数据库准备工作&#xff1a; 在已有数据库中创建新的表&#xff1a; create table t_user (id int,username varchar(20),password varchar(20…

搜索词分析工具-网站关键词挖掘

怎么能找到行业的关键词 以下是如何找到行业关键词的建议&#xff1a; 了解行业&#xff1a;要找到与行业相关的关键词&#xff0c;首先需要了解行业。了解行业以及核心目标&#xff0c;从而更好地理解行业中的主题和词汇。 找到竞争对手网站&#xff1a;搜索竞争对手的网站&…

k8s部署Dashboard

k8s和Dashboard的版本对应关系可以到Dashbord的对应版本里看&#xff0c;比如这里&#xff1a; https://github.com/kubernetes/dashboard/releases/tag/v2.7.0 以下步骤都是在master上执行的。 1. 部署步骤 1. 获取Dashbord的yaml文件 wget https://raw.githubusercontent…

【Git】—— 如何安装Git及简单使用

Git是一个开源的分布式版本控制工具&#xff0c;可以更好地管理你的项目。 一、Linux操作系统 如果用的是Ubuntu系统&#xff0c;只需打开shell界面&#xff0c;输入&#xff1a; sudo apt-get install git-core 按下回车即可完成安装。 二、Windows操作系统 Windows操作系统不…

C语言-数据结构与算法-详细全面的链表知识总结归纳

C语言链式存储结构的详细讲解一.前言(为什么要使用链式存储)一.单链表1.单链表的结点描述2.单链表基本操作(1)初始化单链表(2)采用头插法建立单链表(带头结点)(3).采用尾插法建立单链表(4)按照位序查找结点(4)在链表中间插入结点(5)删除第i个结点二.双链表1.双链表的结点类型描…

和ChatGPT-4聊完后,我觉得一切可能已经来不及了

了然无味&#xff0c;晴空万里&#xff01;和ChatGPT-4开始了一场坦诚的沟通&#xff0c;它全程都表现出高情商&#xff0c;以及不断尽量安抚我的情绪&#xff0c;而这&#xff0c;恰恰令我脊背发凉。 部分文字截取 ZM&#xff1a;我能不能理解每次对话就是一次你的“生命” G&…

【Android -- 软技能】分享一个学习方法

前言 很多人都想通过学习来提升自己&#xff0c;但是&#xff0c;可能因为两个问题&#xff0c;阻碍了自己的高效提升&#xff1a; 学什么&#xff1f; 怎么学&#xff1f; 本文将从自己的学习实践出发&#xff0c;针对这两个问题&#xff0c;给出自己的一套学习流程。 1…