c语言获取linux下cpu、mem、disk信息

2023-11-08

linux下的路径:
cpu: /proc/stat
mem: /proc/meminfo

#define   _ULL   unsigned   long   long
#define   SET_IF_DESIRED(x,y)     if(x)   *(x)   =   (y)

static int five_cpu_numbers(_ULL* uret, _ULL* nret, _ULL* sret, _ULL* iret,
	_ULL* iowait)
{
	static _ULL u = 0, m = 0, s = 0, i = 0, iw = 0;
	_ULL user_j, nice_j, sys_j, idle_j, iowait_j = 0;
	FILE* fp;
	uint16_t byte_read;
	char buffer[100];

	fp = fopen("/proc/stat", "r");
	byte_read = fread(buffer, 1, sizeof(buffer) - 1, fp);
	fclose(fp);

	if (byte_read == 0 || byte_read == sizeof(buffer))
		return -1;
	buffer[byte_read] = '\0';

	sscanf(buffer, "cpu   %Lu   %Lu   %Lu   %Lu   %Lu", &user_j, &nice_j,
		&sys_j, &idle_j, &iowait_j);
	SET_IF_DESIRED(uret, user_j - u);
	SET_IF_DESIRED(nret, nice_j - m);
	SET_IF_DESIRED(sret, sys_j - s);
	/*   Idle   can   go   backwards   one   tick   due   to   kernel   calculation   issues   */
	SET_IF_DESIRED(iret, (idle_j > i) ? (idle_j - i) : 0);
	SET_IF_DESIRED(iowait, iowait_j - iw);
	u = user_j;
	m = nice_j;
	s = sys_j;
	i = idle_j;
	iw = iowait_j;

	return 0;
}

/*
 *   get   the   cpu   usage
 */
float get_cpu_used()
{
	float cpu_usage;
	_ULL user_j, nice_j, sys_j, idle_j, iowait_j = 0;

	if (five_cpu_numbers(&user_j, &nice_j, &sys_j, &idle_j, &iowait_j) != 0)
		return -1;
	usleep(500000);
	if (five_cpu_numbers(&user_j, &nice_j, &sys_j, &idle_j, &iowait_j) != 0)
		return -1;
	usleep(500000);
	if (five_cpu_numbers(&user_j, &nice_j, &sys_j, &idle_j, &iowait_j) != 0)
		return -1;

	cpu_usage = (idle_j * 100.0)
		/ (user_j + nice_j + sys_j + idle_j + iowait_j);

	if (cpu_usage > 100)
		cpu_usage = 100.0;

	/*   change   to   useage   */
	cpu_usage = 100.0 - (cpu_usage);

	return cpu_usage;
}

uint32_t get_mem_used()
{
	FILE* fd;
	int n;
	unsigned long mem_total, mem_used_rate, mem_fee;
	char buff[256], tmp[20];
	fd = fopen("/proc/meminfo", "r");
	fgets(buff, sizeof(buff), fd);
	sscanf(buff, "%s %lu %s\n", tmp, &mem_total, tmp);
	fgets(buff, sizeof(buff), fd);
	sscanf(buff, "%s %lu %s\n", tmp, &mem_fee, tmp);
	mem_used_rate = mem_total - mem_fee;
	mem_used_rate = mem_used_rate * 100 / mem_total;
	fclose(fd);

	return mem_used_rate;
}

void linux_srv_info()
{
	float cpu_usage, cpu_used;
	cpu_used = get_cpu_used();
	printf("cpu:%.f\n", cpu_used);
	
	printf("mem:%d\n", get_mem_used());

	char disk_path[3][10] = { "/","/dev","/var" };
	for (int i = 0; i < 3; i++)//根据磁盘路径(free -h 最后一列)来查询磁盘信息
	{
		char cmd[100] = { 0 };
		char name[20] = { 0 };
		char total[20] = { 0 };
		char used[20] = { 0 };

		/*sprintf(cmd, "df -h %s| grep %s| awk '{print $1,$2,$3}'", disk_path[i], disk_path[i]);
		FILE* fp = popen(cmd, "r");
		int ret = fscanf(fp, "%s %s %s", name, total, used);
		pclose(fp);
		printf("disk:%s %s %s\n", name, total, used);*/
		struct statfs sfs = {0};
		int ret = statfs(disk_path[i], &sfs);//路径必须为磁盘的路径,不是磁盘名。df -h最后一个参数
		int percent = (sfs.f_blocks - sfs.f_bfree) * 100 / (sfs.f_blocks - sfs.f_bfree + sfs.f_bavail + 1);
		printf("disk: %ld %ld %ld %d%% /home\n", 4 * sfs.f_blocks, 4 * (sfs.f_blocks - sfs.f_bfree), 4 * sfs.f_bavail, percent);
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言获取linux下cpu、mem、disk信息 的相关文章

  • 提高mysql导入速度[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我有一个很大的数据库22GB 我曾经用过进行备份mysqldumpgzip 格式的命令 当我提取 gz 文件时 它会生成 sql文件的
  • 如何在特定的Java版本上运行应用程序?

    如何运行具有特定 Java 版本的应用程序 我安装了三个 Java 版本 myuser mysystem sudo update alternatives config java There are 3 choices for the al
  • Ctrl-p 和 Ctrl-n 在 Docker 下表现异常

    For the life of me I can t seem to figure out why ctrl p and ctrl n don t work like they re supposed to under the Docker
  • aarch64 Linux 硬浮点或软浮点

    linux系统有arm64 有arm架构armv8 a 如何知道 Debian 运行的是硬浮动还是软浮动 符合 AAPCS64 GNU GCC for armv8仅提供硬浮动aarch64工具链 这与 armv7 a 的 GCC 不同 后者
  • 如何指定配置脚本的包含目录

    我的工作场所有一个 Linux 系统 其中包含相当旧的软件包 并且没有 root 访问权限 我正在从源代码编译我需要的包 prefix somewhere in homedir 我的问题是我只是不知道如何说服配置在特定目录中查找头文件 源码
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • 打印本周星期一的日期(在 bash 中)

    我想获取本周星期一的 YYYYMMdd 格式的日期 例如 今天是 20110627 从明天到周日 我仍然想打印周一 今天 的日期 然后下周重复这个过程 monday date dmonday Y m d last monday date d
  • 为什么无论 -rdynamic 如何,backtrace 都不包含 Objective-C 符号?

    Update 我正在 Linux 上使用 GNU 运行时 问题是not发生在带有 Apple 运行时的 MacOS 上 更新2 我在 MacOS 上编译了 GNU 运行时并用它构建了示例 该错误确实not发生在带有 GNU 运行时的 Mac
  • 我可以在 Ubuntu 上使用 Homebrew 吗?

    我只是尝试使用 Homebrew 和 Linuxbrew 在我的 Ubuntu 服务器上安装软件包 但都失败了 这就是我尝试安装它们的方法 sudo apt get install build essential curl git m4 r
  • 用于 e NetworkManager VPN 连接的 dbus 信号处理程序

    我需要开发一些在建立 VPN 连接时执行的 python 代码 VPN 由 NetworkManager 控制 我试图弄清楚如何为此使用 NM DBUS 事件 使用 dbus monitor system 我能够识别连接信号 signal
  • 使用 Python 将阿拉伯语或任何从右到左书写系统的字符串打印到 Linux 终端

    非常简单的例子是 city print city 我期望输出是 但实际上输出是相反的字符串 字母看起来有点不同 因为它们有开始 中间和结束形式 我无法将其粘贴到此处 因为复制粘贴会再次更正字符串的顺序 如何在 Linux 终端上正确打印阿拉
  • Linux 上的“软/硬 nofile”是什么意思

    当我尝试在RedHat EL5上安装软件时 我得到了错误 软 硬nofile的期望值是4096 而默认值是1024 我设法增加了这个数字 但我不知道参数是什么 他们指的是软链接和硬链接吗 我改变的方法是 a 修改 etc security
  • 如何在C程序中直接改变显存映射来绘制像素(无需库函数)

    是否可以通过使用 C 程序更改 RAM 中屏幕 视频即监视器 内存映射中的值来显示黑点 我不想使用任何库函数 因为我的主要目标是学习如何开发简单的操作系统 我尝试访问起始屏幕内存映射 即 0xA0000 在 C 中 我尝试运行该程序 但由于
  • 重新链接匿名(未链接但打开)文件

    在 Unix 中 可以创建匿名文件的句柄 例如 使用 creat 创建并打开它 然后使用 unlink 删除目录链接 留下一个带有 inode 和存储的文件 但没有可能的方法重新打开它 此类文件通常用作临时文件 通常这就是 tmpfile
  • 使用 Vala 和 GLib 的正则表达式

    有没有一个函数 比如http php net manual en function preg match all php http php net manual en function preg match all php 使用 GLibh
  • 为什么我的代码在编译用于分析 (-pg) 时在多线程下运行比在单线程下运行慢?

    我正在写一个光线追踪器 最近 我在程序中添加了线程 以利用 i5 四核上的附加内核 奇怪的是 应用程序的调试版本现在运行速度变慢 但优化后的构建运行速度比添加线程之前更快 我将 g pg 标志传递给 gcc 以进行调试构建 并将 O3 标志
  • 设置 Vim 背景颜色

    当我尝试更改背景颜色时 vimrc或者直接在 Vim 中使用以下命令 set background dark 这根本不影响我的背景 也没有light选项 不过 当我运行 gvim 时 看起来还不错 有没有办法在不更改 Konsole 设置的
  • “./somescript.sh”和“. ./somescript.sh”有什么区别

    今天我按照一些说明在 Linux 中安装软件 有一个需要首先运行的脚本 它设置一些环境变量 指令告诉我执行 setup sh 但是我执行时犯了一个错误 setup sh 所以环境没有设置 最后我注意到了这一点并继续进行 我想知道这两种调用脚
  • 在Linux中创建可执行文件

    我计划做的一件事是编写 非常简单的 Perl 脚本 并且我希望能够在不从终端显式调用 Perl 的情况下运行它们 我明白 要做到这一点 我需要授予他们执行权限 使用 chmod 执行此操作非常简单 但它似乎也是一个稍微费力的额外步骤 我想要
  • php56 - CentOS - Remi 仓库

    我刚刚在测试盒上安装了 php 5 6 正常的 cli php 解释器似乎不存在 gt php v bash php command not found gt php56 v PHP 5 6 13 cli built Sep 3 2015

随机推荐

  • 测试今年这行情,不会自动化测试的要做好心理准备了!

    双喜是一名软件测试工程师 入行之后在一家小型公司工作了五年 这段时间里 他主要负责手工测试和一些简单的自动化测试工作 由于公司项目也相对简单 他逐渐陷入了工作的舒适区 没有积极追求新的知识和技能 然而随着身边朋友发展的越来越好 双喜也决定走
  • Python初级第14课——继承(只读课堂)

    欢迎来到 只读课堂 In 1 这节课给大家讲面向对象中的一个继承的理念 class A 在python3中 默认的基类如果括号没有 那么继承自python的object类 pass class A1 A 继承自A类 pass A1 base
  • Scott自学python——字典学习笔记

    字典是Python的中重要的一种数据类型 可以存储任意对像 字典是以键值对的形式创建的 key value 利用大括号包裹着 字典中找某个元素时 是根据键 值字典的每个元素由2部分组成 键 值 访问值的安全方式get方法 在我们不确定字典中
  • 计算机怎样存储数值,(二)计算机如何保存字符和数字,并完成计算

    1 保存字符 计算机在创建之初 只能显示英文字母和特殊字符 后来慢慢才有了其他语言 但是打开网页或者编辑器却可能出现乱码 我们知道计算机只能保存0和1 那么如何把字符保存成二进制 以及如何把二进制解码成对应的字符就是先驱们所做的事情了 我们
  • AD采样的问题答案

    群友提问 请教一个AD采样的问题 现在想采样一个4 20mA的电流信号 信号调理电路如图1所示 输入电流与输出电压关系如图1中公式所示 现在遇到一个问题 当输入电流给定为4 7 93mA时 运放2脚的电压为0 954V Vout为0 652
  • NSIS简介

    1 简介 NSIS是一款帮助开发者创建Windows安装包的工具 NSIS通过NSIS脚本语言 NSIS Script 来配置安装过程中的信息 通过灵活的脚本方式 NSIS可以实现从最简单的文件拷包制作 到需要读写注册表 配置环境变量 以及
  • 局部变量错误

    参考 局部变量错误 云 社区 腾讯云 解析 UnboundLocalError local variable xxx referenced before assignment 在函数外部已经定义了变量n 在函数内部对该变量进行运算 运行时会
  • 计算机新代理大会优美句子,描写计算机教室的优美句子

    描写计算机教室的英语作文六句话怎么写 教室有两扇玻璃门 外边有鞋柜 教室两边各有一台空调 中间是三列 每列有20台电脑老师讲台上有一张桌子 桌子后面有一个大的放映屏幕天花板上有白色灯管 一共有9盏教室有8扇窗户教室里有52张凳子In eac
  • 利用docker 搭建File Browser 文件管理系统

    File Browser就是一个文件浏览器 因为linux并不方便桌面管理 所以Filebrowser就是帮助我们管理linux服务器上文件的程序 你可以称他为网盘程序 可以管理文件 可以分享文件 另外它还可以在线播放 mp4视频 下载fi
  • 云安全技术——执行ifconfig命令提示command not found

    安装完centOS 7 执行ifconfig命令提示command not found 解决办法 查找环境标量是否包含ifconfig 如下图 显示环境变量没有ifconfig 2 执行 yum search ifconfig 查找ifco
  • python mysql connection_Python MySQL连接访问

    将python应用程序连接到数据库有以下步骤 导入mysql connector模块 创建连接对象 创建游标对象 执行查询 创建连接 要在MySQL数据库和python应用程序之间创建连接 请使用mysql connector模块的conn
  • Python绘图系统10:在父组件中使用子组件的函数

    文章目录 Combobox绑定事件 互相调用 源代码 Python绘图系统 从0开始实现一个三维绘图系统 自定义控件 坐标设置控件 坐标列表控件 支持多组数据的绘图系统 图表类型和风格 散点图和条形图 混合类型图表 Combobox绑定事件
  • PMIC驱动之—PMIC硬件相关知识

    PMIC 电源管理集成电路 Power Management IC 在之前项目中 驱动最小系统 对于PMIC这块儿很懵懂 故抽时间查看一些优秀博文及资料 加强对电源管理的理解 本文介绍 PMIC 硬件电路相关的一些知识 在此作一些阶段性的学
  • 负载均衡入门

    提纲 ADC 行业现状 ADC 原理 ADC 的实现方式 为什么是 ADC 而不是负载均衡 功能的扩展 解决了什么问题 可用性 Availability 伸缩性 Scalability 性能 End user performance 数据中
  • Java-类什么时候被加载

    类什么时候被加载 类加载时机 生成该类对象的时候 会加载该类及该类的所有父类 访问该类的静态成员的时候 class forName 类名 加载完以后JVM中就有了该类的元数据 知道这个Class的成员变量和方法等信息 当要new一个类的实例
  • AIO, DIO, CIO

    复杂度3 5 机密度3 5 这些名词都用于数据 文件 访问的模式 既应用程序用什么方案实现对文件的读写 AIO AIO 的全称为 Asynchronous I O 既异步 I O 在 AIO 的工作模式下 应用程序发起 call I O请求
  • 动态封装对象,属性来自json

    需求 如何动态的获取一个对象的字段 假如一个对象里面有name age sex三个字段 我想取name的值 这个name是存在一个json中 json的格式如下 key name key age key sex 先遍历这个json 然后再根
  • golang struct 详解

    转载自 https juejin im post 6844903814168838151 Go Struct超详细讲解 原创作者 公众号 程序员读书 欢迎关注公众号 转载文章请注明出处哦 Go语言中提供了对struct的支持 struct
  • Ubuntu 通用命令大全

    查看目录 ls 用不同颜色 经过排列的文本列出目录下的文件 不包括隐藏文件 ls a 列出当前路径下的所有文件 ls l 列出当前目录下可见文件的详细信息 包括用户权限 建立用户 建立时间 占用空间等 返回上一级 cd 上级目录名称 在终端
  • c语言获取linux下cpu、mem、disk信息

    linux下的路径 cpu proc stat mem proc meminfo define ULL unsigned long long define SET IF DESIRED x y if x x y static int fiv