C++代码: Linux下获取基本设备信息

2023-05-16

测试环境

基于C++20构建测试 (g++ 10.2.1)
在这里插入图片描述

CMakeLists.txt

# 设置用于构建该项目的最低cmake版本
cmake_minimum_required(VERSION 3.1)

# 设置项目名称和编程语言
project(获取Linux信息 CXX)

# 设置二进制文件生成路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
# 获取源码的路径
aux_source_directory(src src)

# 设置编译标准和额外参数
add_compile_options(-std=c++20 -Wall -Werror -Wextra -pedantic -Wimplicit-fallthrough -Wsequence-point -Wswitch-default -Wswitch-unreachable -Wswitch-enum -Wstringop-truncation -Wbool-compare -Wtautological-compare -Wfloat-equal -Wshadow=global -Wpointer-arith -Wpointer-compare -Wcast-align -Wcast-qual -Wwrite-strings -Wdangling-else -Wlogical-op -Wconversion -Wno-pedantic-ms-format)

# 从源码构建二进制文件
add_executable(demo ${src})

结构参考下图
在这里插入图片描述

源码

1.获取IP

/**
 * @file getIP.cpp
 * @author IYATT-yx
 * @brief 获取IP
 * @details Ubuntu 20.04 64-bit  C++20
 */
#include <iostream>
#include <cstring>

extern "C"
{
    #include <arpa/inet.h>
    #include <ifaddrs.h>
    #include <netinet/in.h>
}

int main()
{
    struct ifaddrs *ifAddrStruct = NULL;
    void *tmpAddrPtr = NULL;

    getifaddrs(&ifAddrStruct);
    while (ifAddrStruct != NULL)    
    {
        if (ifAddrStruct->ifa_addr->sa_family == AF_INET)
        {
            tmpAddrPtr = &((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr;
            char addressBuffer[INET_ADDRSTRLEN];
            inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);

            if (strcmp(ifAddrStruct->ifa_name, "eth0") == 0)
            {
                std::cout << "eth0: " << addressBuffer << std::endl;
                break;
            }
            else if (strcmp(ifAddrStruct->ifa_name, "wlan0") == 0)
            {
                std::cout << "wlan0: " << addressBuffer << std::endl;
                break;
            }
        }
        ifAddrStruct = ifAddrStruct->ifa_next;
    }
}

在这里插入图片描述

2.获取磁盘信息

磁盘信息

/**
 * @file getDiskInfo.cpp
 * @author IYATT-yx
 * @brief 获取磁盘使用信息
 * @details Ubuntu 20.04 64-bit  C++20
 */
#include <iostream>

extern "C"
{
    #include <sys/vfs.h>
    #include <unistd.h>
}

struct statfs diskInfo;

int main()
{
    statfs("/", &diskInfo);
    long long unsigned totalBlocks = diskInfo.f_bsize;
    long long unsigned totalSize = (totalBlocks * diskInfo.f_blocks) >> 20;
    long long unsigned freeDisk = (diskInfo.f_bfree * totalBlocks) >> 20;

    std::cout << "磁盘总大小: " << totalSize << " MB"
                << "\n空闲大小: " << freeDisk << " MB" << std::endl;
}

在这里插入图片描述

3.CPU使用率

计算原理 (仅供参考):
将每两次读取 /proc/stat 中的数据计算差值 (源数据是从计算机启动开始计时到读取时的时间), 然后实现计算 (user + nice + system + iowait + irq + softifq) / (user + nice + system + idle + iowait + irq + softirq) 作为CPU使用率

第一行的数据解释
user从系统启动开始累计到当前时刻,处于用户态的运行时间,不包含 nice值为负进程
nice从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间
system从系统启动开始累计到当前时刻,处于核心态的运行时间
idle从系统启动开始累计到当前时刻,除IO等待时间以外的其它等待时间
iowait从系统启动开始累计到当前时刻,IO等待时间
irq从系统启动开始累计到当前时刻,硬中断时间
softirq从系统启动开始累计到当前时刻,软中断时间
/**
 * @file getCpuUsage.cpp
 * @author IYATT-yx
 * @brief 计算CPU使用率
 * @details Ubuntu 20.04 64-bit  C++20
 */
#include <iostream>
#include <fstream>

extern "C"
{
    #include <unistd.h>
}

int main()
{
    std::string cpu;
    std::ifstream readCPU;

    readCPU.open("/proc/stat", std::ifstream::in);
    long luser, lnice, lsys, lidle, liowait, lirq, lsoftirq, ltotal;
    readCPU >> cpu >> luser >> lnice >> lsys >> lidle >> liowait >> lirq >> lsoftirq;
    ltotal = luser + lnice + lsys + lidle + liowait + lirq + lsoftirq;
    readCPU.close();

    while (true)
    {
        sleep(2);
        
        readCPU.open("/proc/stat", std::ifstream::in);
        long  user, nice, sys, idle, iowait, irq, softirq, total;
        readCPU >> cpu >> user >> nice >> sys >> idle >> iowait >> irq >> softirq;
        readCPU.close();
        total = user + nice + sys + idle + iowait + irq + softirq;
        long usage = static_cast<long>(static_cast<double>(total - ltotal - (idle - lidle)) / static_cast<double>(total - ltotal) * 100);
        std::cout << "CPU使用率: " << usage << " %" << std::endl;

        luser = user;
        lnice = nice;
        lsys = sys;
        lidle = idle;
        liowait = iowait;
        lirq = irq;
        lsoftirq = softirq;
        ltotal = total;
    }
} 

在这里插入图片描述

4.获取CPU温度 (仅树莓派可用)

/**
 * @file getCpuTemp.cpp
 * @author IYATT-yx
 * @brief 获取CPU温度
 * @details Raspberry Pi 4B 1.1  Raspberry Pi OS 64-bit beta (2020-8-24)  C++20
 */
#include <iostream>
#include <fstream>

extern "C"
{
    #include <unistd.h>
}

int main()
{
    std::ifstream cpuTemp;
    long temp;

    while (true)
    {
        cpuTemp.open("/sys/class/thermal/thermal_zone0/temp", std::ifstream::in);
        cpuTemp >> temp;
        std::cout << "CPU温度为: " << static_cast<double>(temp) / 1000 << std::endl;
        cpuTemp.close();
        sleep(1);
    }
}

在这里插入图片描述

5.获取内存和交换分区信息

1

/**
 * @file getRamInfo.cpp
 * @author IYATT-yx
 * @brief 获取内存和交换分区信息
 * @details Ubuntu 20.04 64-bit  C++20
 */
#include <iostream>

extern "C"
{
    #include <sys/sysinfo.h>
    #include <unistd.h>
}

struct sysinfo sysInfo;

int main()
{
    system("clear");
    while (true)
    {
        if (sysinfo(&sysInfo) != 0)
        {
            std::cerr << "sysinfo Error" << std::endl;
            continue;
        }

        unsigned long totalRAM = sysInfo.totalram >> 20;
        unsigned long freeRAM = sysInfo.freeram >> 20;
        unsigned long sharedRam = sysInfo.sharedram >> 20;
        unsigned long buffersRam = sysInfo.bufferram >> 20;

        std::cout << "total: " << totalRAM << "  MB\n"
                    << "free: " << freeRAM << "  MB\n"
                    << "shared: " << sharedRam << "  MB\n"
                    << "buff/cache: " << buffersRam << "  MB\n" << std::endl;

        unsigned long totalSwap = sysInfo.totalswap >> 20;
        unsigned long freeSwap = sysInfo.freeswap >> 20;

        std::cout << "total swap: " << totalSwap << " MB\n"
                    << "free swap: " << freeSwap << "MB" << std::endl; 

        sleep(1);
        system("clear");
    }
}

在这里插入图片描述

2

/**
 * @file getRamInfo.cpp
 * @author IYATT-yx
 * @brief 获取内存和交换分区信息
 * @details Raspberry Pi 4B 1.1  Raspberry Pi OS 64-bit beta (2020-8-24)  C++20
 */
#include <iostream>
#include <fstream>
#include <string>

int main()
{
    std::ifstream ifs("/proc/meminfo", std::ifstream::in);
    // 读取值
    long value;
    // 匹配项目名字 占位
    std::string itemName, strNULL;

    while (itemName != "MemTotal:")
    {
        ifs >> itemName >> value >> strNULL;
    }
    std::cout << "总内存: " << (value >> 10) << "MB" << std::endl;

    while (itemName != "MemFree:")
    {
        ifs >> itemName >> value >> strNULL;
    }
    std::cout << "未使用内存: " << (value >> 10) << "MB" << std::endl;

    while (itemName != "MemAvailable:")
    {
        ifs >> itemName >> value >> strNULL;
    }
    std::cout << "可用内存:" <<  (value >> 10) << "MB" << std::endl;

    while (itemName != "Buffers:")
    {
        ifs >> itemName >> value >> strNULL;
    }
    std::cout << "缓冲区: " << (value >> 10) << "MB" << std::endl;

    while (itemName != "Cached:")
    {
        ifs >> itemName >> value >> strNULL;
    }
    std::cout << "页高速缓存: " << (value >> 10) << "MB" << std::endl;

    while (itemName != "SwapTotal:")
    {
        ifs >> itemName >> value >> strNULL;
    }
    std::cout << "交换分区总大小: " << (value >> 10) << "MB" << std::endl;

    while (itemName != "SwapFree:")
    {
        ifs >> itemName >> value >> strNULL;
    }
    std::cout << "交换分区未使用大小: " << (value >> 10) << "MB" << std::endl;
}

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++代码: Linux下获取基本设备信息 的相关文章

  • 来自守护程序的错误响应:加入会话密钥环:创建会话密钥:超出磁盘配额

    我尝试在我的服务器上安装 docker 使用本教程 https docs docker com install linux docker ce ubuntu 我想远程运行 docker 镜像并使用 portainer Web 界面来管理一切
  • awk 在循环中使用时不打印任何内容[重复]

    这个问题在这里已经有答案了 我有一堆使用 file 1 a 1 txt 格式的文件 如下所示 A 1 B 2 C 3 D 4 并使用以下命令添加包含每个文件名称的新列 awk print FILENAME NF t 0 file 1 a 1
  • ioctl 命令的用户权限检查

    我正在实现 char 驱动程序 Linux 并且我的驱动程序中有某些 IOCTL 命令仅需要由 ADMIN 执行 我的问题是如何在 ioctl 命令实现下检查用户权限并限制非特权用户访问 IOCTL 您可以使用bool capable in
  • 找不到包“gdk-pixbuf-2.0”

    我正在尝试在 Amazon Linux 发行版实例上构建 librsvg 我已经通过 yum 安装了大部分依赖项 其中一些在实例上启用的默认 yum 存储库中不可用 因此必须从头开始构建它们 我已经走了很远 但还停留在最后一点 跑步时sud
  • 为什么 Linux 原始套接字的 RX 环大小限制为 4GB?

    背景 我试图mmap 我的原始套接字的 RX 环形缓冲区64 bitLinux 应用程序 我的环由 4096 个块组成 每个块大小为 1MB 总共 4GB 请注意 每个 1MB 块中可以有许多帧 如果您好奇 请参阅此文档了解背景信息 htt
  • Google BQ:运行参数化查询,其中参数变量是 BQ 表目标

    我正在尝试从 Linux 命令行为 BQ 表目标运行 SQL 此 SQL 脚本将用于多个日期 客户端和 BQ 表目标 因此这需要在我的 BQ API 命令行调用中使用参数 标志 parameter 现在 我已经点击此链接来了解参数化查询 h
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • 我们真的应该使用 Chef 来管理 sudoers 文件吗?

    这是我的问题 我担心如果 Chef 破坏了 sudoers 文件中的某些内容 可能是 Chef 用户错误地使用了说明书 那么服务器将完全无法访问 我讨厌我们完全失去客户的生产服务器 因为我们弄乱了 sudoers 文件并且无法再通过 ssh
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • 就分页分段内存而言的程序寿命

    我对 x86 Linux 机器中的分段和分页过程有一个令人困惑的概念 如果有人能澄清从开始到结束所涉及的所有步骤 我们将很高兴 x86 使用分页分段内存技术进行内存管理 任何人都可以解释一下从可执行的 elf 格式文件从硬盘加载到主内存到它
  • 执行“minikube start”命令时出现问题

    malik malik minikube start minikube v1 12 0 on Ubuntu 18 04 Using the docker driver based on existing profile Starting c
  • 无需超级用户即可在 Linux 中打开 RAW 套接字

    我必须编写一个在 Linux 上运行的 ping 函数 语言是 C 所以 C 也可以 在网上搜索并查看源代码ping命令 事实证明我应该创建一个原始套接字 icmp sock socket AF INET SOCK RAW IPPROTO
  • GMail 421 4.7.0 稍后重试,关闭连接

    我试图找出为什么它无法使用 GMail 从我的服务器发送邮件 为此 我使用 SwiftMailer 但我可以将问题包含在以下独立代码中
  • 使用非规范地址检索内存数据会导致 SIGSEGV 而不是 SIGBUS

    我无法使用以下汇编代码产生 总线错误 这里我使用的内存地址不是合法的 规范地址 那么 我怎样才能触发该错误呢 我在带有 NASM 2 14 02 的 Ubuntu 20 04 LTS 下运行这段代码 但它会导致负载出现 SIGSEGV 分段
  • 使用循环在 C 中管道传输两个或多个 shell 命令

    我正在尝试执行ls wc l通过 C 语言程序 而不是使用命令行 这是我当前的工作代码 int main int pfds 2 pipe pfds pid t pid fork if pid 0 The child process clos
  • CMake 链接 glfw3 lib 错误

    我正在使用 CLion 并且正在使用 glfw3 库编写一个程序 http www glfw org docs latest http www glfw org docs latest 我安装并正确执行了库中的所有操作 我有 a 和 h 文
  • 使用包管理器时如何管理 Perl 模块?

    A 最近的问题 https stackoverflow com questions 397817 unable to find perl modules in intrepid ibex ubuntu这让我开始思考 在我尝试过的大多数 Li
  • 与 pthread 的进程间互斥

    我想使用一个互斥体 它将用于同步对两个不同进程共享的内存中驻留的某些变量的访问 我怎样才能做到这一点 执行该操作的代码示例将非常感激 以下示例演示了 Pthread 进程间互斥体的创建 使用和销毁 将示例推广到多个进程作为读者的练习 inc
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • 如何在 *nix 中登录时运行脚本?

    我知道我曾经知道如何做到这一点 但是 如何在 unix 中登录时运行脚本 bash 可以 From 维基百科 Bash http en wikipedia org wiki Bash 28Unix shell 29 当 Bash 启动时 它

随机推荐