当前位置: 首页 > wzjs >正文

门户网站建设培训简报什么做直播网站好

门户网站建设培训简报,什么做直播网站好,网络运维工程师面试常见问题,重庆网络推广公司现代c获取linux系统磁盘大小 前言一、命令获取系统磁盘大小二、使用c获取系统磁盘大小三、总结 前言 本文介绍一种使用c获取linux系统磁盘大小的方法 一、命令获取系统磁盘大小 在linux系统中可以使用lsblk命令显示当前系统磁盘大小,如下图所示 lsblk二、使用c获…

现代c++获取linux系统磁盘大小

  • 前言
  • 一、命令获取系统磁盘大小
  • 二、使用c++获取系统磁盘大小
  • 三、总结

前言

本文介绍一种使用c++获取linux系统磁盘大小的方法

一、命令获取系统磁盘大小

linux系统中可以使用lsblk命令显示当前系统磁盘大小,如下图所示

lsblk

在这里插入图片描述

二、使用c++获取系统磁盘大小

  • 在使用c++获取磁盘大小之前我们先了解一下linux下的/sys/block目录,有兴趣的可以去详细了解下,我这里就不卖关子了,首先呢/sys/block目录存放的是所有的块设备文件,也就是系统磁盘分区。如下图所示
    在这里插入图片描述

  • 上图中的每一个子目录如loop0mmcblk1zram0等都是系统上的磁盘分区文件,也就是说每一个子目录都是一个磁盘分区设备,可以理解为当前系统有子目录这么多的块设备,如果说我们把所有块设备的大小加起来不就是我们磁盘大小了吗,没错,我们就是要这样干。

  • 首先,每个块设备都是一个目录,这个目录下存放的有该块设备的一些信息,如下图所示
    在这里插入图片描述

  • 我们重点关注的是这个size文件,这个文件中存放的是这个块设备所占有的磁盘扇区数(注意不是字节数,是扇区数量)如下图所示
    在这里插入图片描述

  • 接下来我们要知道一个扇区多少个字节呢,这个是存放在每个块设备目录下的queue/hw_sector_size里的
    在这里插入图片描述
    在这里插入图片描述

  • 接下来我们要知道这些块设备哪些是虚拟的块设备,哪些是实际的块设备,有一个典型的区分方法,就是如果是虚拟的块设备,它的子目录下通常没有device目录,而实际设备是有device目录的
    在这里插入图片描述
    在这里插入图片描述

  • 接下来我们整理一下思路

    1. 收集/sys/block下的所有子目录名称(块设备)
    2. 根据块设备目录下是否有device目录来判断它是否是虚拟设备,排除所有的虚拟设备,得到实际块设备
    3. 读取实际块设备目录下的size文件获取该块设备占用的扇区数。
    4. 读取实际块设备目录下的queue/hw_sector_size获取一个扇区占用多少字节。
    5. 得到一个(实际块设备占用的字节数) = (该块设备占用扇区数) * (该块设备扇区占用字节数)。
    6. 遍历所有的实际块设备得到他们占用的字节数,再相加,就是系统磁盘大小。
  • 先写一些辅助方法,如判断文件或者文件夹是否存在的方法, 如果文件中只有一个数字,获取该数字的方法

#include <string>
#include <filesystem> // 需要c++17支持
#include <fstream>
bool directIsExists(const std::string &path) {return std::filesystem::exists(path);
}std::size_t getFileNumber(const std::string &path) {std::size_t number = 0;std::ifstream ifs(path);if (!ifs.is_open()) {return number;}ifs >> number;return number;
}

如果不支持c++17,可以使用下面方法平替

#include <string>
#include <unistd.h>
#include <fstream>
bool directIsExists(const std::string &path) {return access(path.c_str(), F_OK) == 0;
}std::size_t getFileNumber(const std::string &path) {std::size_t number = 0;std::ifstream ifs(path);if (!ifs.is_open()) {return number;}ifs >> number;return number;
}
  • 收集/sys/block目录下的所有实际块设备
#include <string>
#include <iostream>
#include <filesystem>
#include <vector>
std::vector<std::string> getBlockDevices(void) {std::vector<std::string> subdirs;try {for (const auto &entry : std::filesystem::directory_iterator("/sys/block")) {if (std::filesystem::is_directory(entry.status())) {if (directIsExists("/sys/block/" + entry.path().filename().string() + "/device")) {subdirs.push_back(entry.path().filename().string());}}}}catch (const std::filesystem::filesystem_error &e) {std::cerr << "Error accessing : " << e.what() << std::endl;}return subdirs;
}

如果不支持c++17,可以使用下面方法平替

#include <vector>
#include <string>
#include <iostream>
#include <dirent.h>
std::vector<std::string> getBlockDevices() {std::vector<std::string> subdirs;DIR *dir = opendir("/sys/block");if (dir == nullptr) {perror("opendir");return subdirs;}struct dirent *entry;while ((entry = readdir(dir)) != nullptr) {if (std::string(entry->d_name) != "." && std::string(entry->d_name) != "..") {if (directIsExists("/sys/block/" + std::string(entry->d_name) + "/device")) {subdirs.push_back(entry->d_name);}}}closedir(dir);return subdirs;
}
  • 获取指定块设备的扇区数
std::size_t getSectorNumber(const std::string &path) {return getFileNumber(path);
}
  • 获取指定块设备的扇区的大小
std::size_t getSectorSize(const std::string &path) {return getFileNumber(path);
}
  • 获取总大小
std::size_t getDiskSize(void) {std::size_t number = 0;for (const auto &it : getBlockDevices()) {std::cout << it << std::endl;std::cout << getSectorNumber("/sys/block/" + it + "/size") << std::endl;std::cout << getSectorSize("/sys/block/" + it + "/queue/hw_sector_size") << std::endl;number += getSectorNumber("/sys/block/" + it + "/size") * getSectorSize("/sys/block/" + it + "/queue/hw_sector_size");}return number;
}

完整代码如下

#include <filesystem>
#include <fstream>
#include <iostream>
#include <string>
#include <unistd.h>
#include <vector>
bool directIsExists(const std::string &path) {return std::filesystem::exists(path);
}std::vector<std::string> getBlockDevices(void) {std::vector<std::string> subdirs;try {for (const auto &entry : std::filesystem::directory_iterator("/sys/block")) {if (std::filesystem::is_directory(entry.status())) {if (directIsExists("/sys/block/" + entry.path().filename().string() + "/device")) {subdirs.push_back(entry.path().filename().string());}}}}catch (const std::filesystem::filesystem_error &e) {std::cerr << "Error accessing : " << e.what() << std::endl;}return subdirs;
}// #include <dirent.h>// bool directIsExists(const std::string &path) {
//     return access(path.c_str(), F_OK) == 0;
// }
// std::vector<std::string> getBlockDevices() {
//     std::vector<std::string> subdirs;//     DIR *dir = opendir("/sys/block");
//     if (dir == nullptr) {
//         perror("opendir");
//         return subdirs;
//     }//     struct dirent *entry;
//     while ((entry = readdir(dir)) != nullptr) {
//         if (std::string(entry->d_name) != "." && std::string(entry->d_name) != "..") {
//             if (directIsExists("/sys/block/" + std::string(entry->d_name) + "/device")) {
//                 subdirs.push_back(entry->d_name);
//             }
//         }
//     }//     closedir(dir);
//     return subdirs;
// }std::size_t getFileNumber(const std::string &path) {std::size_t number = 0;std::ifstream ifs(path);if (!ifs.is_open()) {return number;}ifs >> number;return number;
}std::size_t getSectorNumber(const std::string &path) {return getFileNumber(path);
}std::size_t getSectorSize(const std::string &path) {return getFileNumber(path);
}std::size_t getDiskSize(void) {std::size_t number = 0;for (const auto &it : getBlockDevices()) {number += getSectorNumber("/sys/block/" + it + "/size") * getSectorSize("/sys/block/" + it + "/queue/hw_sector_size");}return number;
}int main(int argc, char **argv) {auto num = getDiskSize();std::cout << "bytes --> " << num << std::endl;std::cout << num / 1024.0 << "kb" << std::endl;std::cout << num / 1024.0 / 1024.0 << "Mb" << std::endl;std::cout << num / 1024.0 / 1024.0 / 1024.0 << "Gb" << std::endl;return 0;
}

编译并执行, g++ main.cpp -o main -std=c++17 && ./main, 执行结果如下
在这里插入图片描述
在这里插入图片描述

三、总结

通过上诉方法确实可以获取磁盘容量,亲测可用!!!


文章转载自:

http://LBzRhx4W.bwttj.cn
http://DMZpKetY.bwttj.cn
http://XJlHb4NH.bwttj.cn
http://5chi3Q5r.bwttj.cn
http://sSahxc2J.bwttj.cn
http://Fgumm6zG.bwttj.cn
http://fqMyYOXc.bwttj.cn
http://JAjkenov.bwttj.cn
http://Rf31ldz1.bwttj.cn
http://uW0o9a71.bwttj.cn
http://3JSxmS1q.bwttj.cn
http://glIQBza1.bwttj.cn
http://bVUN6AEb.bwttj.cn
http://BHiSVjpE.bwttj.cn
http://vyvPFLRg.bwttj.cn
http://wOJ9LnR2.bwttj.cn
http://kCgK9Afz.bwttj.cn
http://jdxNhjPH.bwttj.cn
http://r7STmswv.bwttj.cn
http://i45QrvQA.bwttj.cn
http://Qt80eY70.bwttj.cn
http://zsRx1fV5.bwttj.cn
http://LG1IoMWJ.bwttj.cn
http://IuRrXUMu.bwttj.cn
http://qZCTPHPm.bwttj.cn
http://r0FUXoq1.bwttj.cn
http://Sh819RaA.bwttj.cn
http://YefAocoB.bwttj.cn
http://zneZrwoa.bwttj.cn
http://SBNioRjz.bwttj.cn
http://www.dtcms.com/wzjs/688266.html

相关文章:

  • 济南建站优化wordpress 医疗
  • 哈尔滨服务专业的建站网站建设与开发试题与答案
  • 电商网站 建社区江西h5响应式网站建设设计
  • 太原网站建设电话帝国和wordpress
  • 网站建设域名的购买网站编辑的工作职能有哪些
  • 接单做一个网站多少钱专业做网站开发
  • 如何做学校网站app怎样做医疗保健网站
  • pc和移动端网站跳转网站 建设 基本 数据库
  • 昆明做网站费用江西专业的网站建设公司
  • php网站建设全程实例自媒体135的网站是多少
  • 会用框架做网站能找到工作吗茂名平安建设网站
  • 网站标签怎么做跳转建立一个企业网站
  • 域名网站建设丰县建设网站
  • 拼团做的比较好的网站做美容网站
  • 做一个网站放网上要多少钱网络组建拓扑图
  • 自动搭建网站源码如何注册网站域名备案
  • 换公司网站域名要改吗网站制作 php
  • 网站的后台一般用什么做的wordpress如何让标签大小一致
  • 企业开源建站系统市场调研问卷调查怎么做
  • 阿里巴巴专门做外贸的网站淮北矿业工程建设有限公司网站
  • 网站建设活动方案南浦电商网站建设
  • 萝岗高端网站建设网店推广平台有哪些
  • 建筑设计网站网址怎么做贝店式的网站
  • 找工作哪个网站好2022太原线上推广公司
  • 网站前台可以打开网站开发高级工程师
  • vue适合什么样的网站开发wordpress怎样发询盘
  • 网站代码编辑器玉溪网站建设
  • 上海营销型网站建设费用怎么创建网页快捷方式
  • 免费无版权图片素材网站网页搜索功能怎么实现
  • 青海城乡建设厅网站 官网为什么要做营销型的网站建设