free -m
命令来查看内存占用情况。
在Linux系统中,获取服务器内存占用率是一项常见的任务,这对于系统监控和性能调优至关重要,下面将详细介绍如何在C语言中实现这一功能,并解释相关的系统调用和数据结构。
一、使用/proc/meminfo
文件获取内存信息
需要以只读方式打开/proc/meminfo
文件,该文件包含了系统的内存使用情况,通过逐行读取文件内容,可以提取出总内存(MemTotal)、已用内存(MemUsed)等信息。
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { unsigned long total; unsigned long free; unsigned long available; } MEMORY_INFO; void get_memory_usage(MEMORY_INFO *mem_info) { FILE *fp = fopen("/proc/meminfo", "r"); if (fp == NULL) { perror("Failed to open /proc/meminfo"); exit(EXIT_FAILURE); } char line[256]; while (fgets(line, sizeof(line), fp)) { if (strncmp(line, "MemTotal:", 9) == 0) { sscanf(line + 9, "%lu", &mem_info->total); } else if (strncmp(line, "MemFree:", 8) == 0) { sscanf(line + 8, "%lu", &mem_info->free); } else if (strncmp(line, "MemAvailable:", 13) == 0) { sscanf(line + 13, "%lu", &mem_info->available); break; } } fclose(fp); }
通过读取到的总内存和可用内存,可以计算出内存的占用率,占用率可以通过以下公式计算:(总内存 可用内存) / 总内存 * 100%
。
double calculate_memory_usage(MEMORY_INFO mem_info) { return ((double)(mem_info.total mem_info.available) / mem_info.total) * 100.0; }
在主函数中,调用上述函数获取内存信息,并计算内存占用率。
int main() { MEMORY_INFO mem_info; get_memory_usage(&mem_info); double usage = calculate_memory_usage(mem_info); printf("Memory Usage: %.2f%% ", usage); return 0; }
二、使用sysinfo
系统调用获取内存信息
除了直接读取/proc/meminfo
文件外,还可以使用sysinfo
系统调用来获取内存信息,这种方法更为直接,但需要包含相应的头文件并链接相应的库。
需要包含<sys/sysinfo.h>
头文件,并定义一个sysinfo
结构体实例来存储系统信息。
#include <stdio.h> #include <stdlib.h> #include <sys/sysinfo.h> int main() { struct sysinfo info; if (sysinfo(&info) != 0) { perror("sysinfo error"); return EXIT_FAILURE; } unsigned long total_mem = info.totalram; // totalram是以KB为单位的,如果需要转换为MB或GB,请除以相应的倍数 unsigned long free_mem = info.freeram; unsigned long used_mem = total_mem free_mem; double usage = ((double)used_mem / total_mem) * 100.0; printf("Memory Usage: %.2f%% ", usage); return 0; }
两种方法各有优缺点:
读取/proc/meminfo
文件:这种方法简单直观,不需要额外的库支持,但需要手动解析文件内容,适用于只需要获取基本内存信息的场景。
使用sysinfo
系统调用:这种方法更为直接和高效,因为它是系统提供的接口,专门用于获取系统信息,但需要包含特定的头文件并链接相应的库,适用于需要获取更详细或更准确的系统信息的场景。
在实际应用中,可以根据具体需求选择合适的方法来获取服务器的内存占用率,还需要注意处理可能的异常情况,如文件读取失败或系统调用失败等。