问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C语言获取系统内存的三种方法

创作时间:
作者:
@小白创作中心

C语言获取系统内存的三种方法

引用
1
来源
1.
https://docs.pingcode.com/baike/1252404

在C语言中获取系统内存的方法有多种,包括使用系统调用、库函数以及操作系统特定的接口。其中,常见的方法有:使用sysconf函数、读取系统文件(如/proc/meminfo)、以及调用操作系统提供的API(如Windows的GlobalMemoryStatusEx)。下面将详细介绍如何使用这些方法获取系统内存信息。

一、使用sysconf函数获取内存信息

1.1、简介

sysconf是POSIX标准的一部分,它允许程序查询系统配置参数。通过调用sysconf函数,可以获取许多系统级别的信息,包括内存页的大小和可用的物理内存页数。

1.2、代码示例

下面是一个使用sysconf函数获取系统内存信息的示例代码:

#include <stdio.h>
#include <unistd.h>

int main() {
    long page_size = sysconf(_SC_PAGESIZE);
    long num_pages = sysconf(_SC_PHYS_PAGES);
    long free_pages = sysconf(_SC_AVPHYS_PAGES);
    if (page_size == -1 || num_pages == -1 || free_pages == -1) {
        perror("sysconf");
        return 1;
    }
    printf("Page size: %ld bytes\n", page_size);
    printf("Total memory: %ld bytes\n", page_size * num_pages);
    printf("Available memory: %ld bytes\n", page_size * free_pages);
    return 0;
}

1.3、详细描述

在这个示例中,sysconf(_SC_PAGESIZE)返回系统内存页的大小,sysconf(_SC_PHYS_PAGES)返回物理内存页的总数,sysconf(_SC_AVPHYS_PAGES)返回可用的物理内存页数。通过这些信息,可以计算出系统的总内存和可用内存。

二、读取/proc/meminfo文件获取内存信息

2.1、简介

在Linux系统中,/proc/meminfo文件包含了关于系统内存使用情况的详细信息。通过读取这个文件,可以获取到总内存、可用内存、缓冲区内存等多种信息。

2.2、代码示例

下面是一个读取/proc/meminfo文件并解析内存信息的示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFFER_SIZE 256

void parse_meminfo() {
    FILE *file = fopen("/proc/meminfo", "r");
    if (file == NULL) {
        perror("fopen");
        return;
    }
    char line[BUFFER_SIZE];
    while (fgets(line, sizeof(line), file) != NULL) {
        if (strncmp(line, "MemTotal:", 9) == 0) {
            printf("Total memory: %s", line + 9);
        } else if (strncmp(line, "MemFree:", 8) == 0) {
            printf("Free memory: %s", line + 8);
        } else if (strncmp(line, "Buffers:", 8) == 0) {
            printf("Buffer memory: %s", line + 8);
        } else if (strncmp(line, "Cached:", 7) == 0) {
            printf("Cached memory: %s", line + 7);
        }
    }
    fclose(file);
}

int main() {
    parse_meminfo();
    return 0;
}

2.3、详细描述

在这个示例中,程序打开/proc/meminfo文件并逐行读取内容。通过检查每行的前缀,可以找到包含内存信息的行,并解析出相关的数值进行输出。MemTotal表示总内存,MemFree表示空闲内存,Buffers表示缓冲区内存,Cached表示缓存内存。

三、使用Windows API获取内存信息

3.1、简介

在Windows操作系统中,可以使用GlobalMemoryStatusEx函数来获取系统内存信息。这个函数是Windows API的一部分,可以返回详细的内存状态信息,包括物理内存、虚拟内存等。

3.2、代码示例

下面是一个使用GlobalMemoryStatusEx函数获取系统内存信息的示例代码:

#include <windows.h>
#include <stdio.h>

int main() {
    MEMORYSTATUSEX statex;
    statex.dwLength = sizeof(statex);
    if (GlobalMemoryStatusEx(&statex)) {
        printf("Total physical memory: %llu bytes\n", statex.ullTotalPhys);
        printf("Available physical memory: %llu bytes\n", statex.ullAvailPhys);
        printf("Total virtual memory: %llu bytes\n", statex.ullTotalVirtual);
        printf("Available virtual memory: %llu bytes\n", statex.ullAvailVirtual);
    } else {
        printf("Error getting memory status\n");
    }
    return 0;
}

3.3、详细描述

在这个示例中,程序创建一个MEMORYSTATUSEX结构体,并调用GlobalMemoryStatusEx函数来填充这个结构体。然后,程序可以从结构体中读取各种内存信息,并将其输出到控制台。

四、总结

通过以上三种方法,我们可以在C语言中获取系统内存信息。使用sysconf函数的方法适用于POSIX兼容的系统,如Linux和macOS;读取/proc/meminfo文件的方法专门针对Linux系统;使用Windows API的方法则适用于Windows操作系统。

4.1、选择方法的建议

  • 跨平台兼容性:如果需要编写跨平台的代码,可以使用条件编译来选择适当的方法。例如,在POSIX系统中使用sysconf,在Windows系统中使用GlobalMemoryStatusEx
  • 性能和效率:读取/proc/meminfo文件的方法相对简单,但可能在性能上不如直接使用系统调用或API。对于性能敏感的应用,可以选择更高效的方法。
  • 信息的详细程度:不同的方法提供的内存信息可能有所不同。根据需要获取的信息,选择合适的方法。例如,如果只需要总内存和可用内存,使用sysconfGlobalMemoryStatusEx即可;如果需要更详细的信息,可以读取/proc/meminfo
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号