虽然记录为可用,但显然它是一个文档错误,因为它不是。
但是,手册页确实指向了另一个接口:sysctl()。您可以使用sysctlbyname() 接口获取物理内存(以字节为单位)。
#include <iostream>
#include <stdint.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/sysctl.h>
int main () {
size_t pagesz = sysconf(_SC_PAGE_SIZE);
uint64_t mem;
size_t len = sizeof(mem);
sysctlbyname("hw.memsize", &mem, &len, NULL, 0);
std::cout << mem << '\n';
std::cout << mem/pagesz << '\n';
std::cout << mem/1024/1024/1024 << '\n';
}
为了模拟两种编译环境的功能,我将创建一个包装函数并根据条件编译修改该函数的作用。
#define PHYS_PAGES get_phys_pages()
unsigned get_phys_pages () {
static unsigned phys_pages;
if (phys_pages == 0) {
#if USE_SYSCTL_HW_MEMSIZE
uint64_t mem;
size_t len = sizeof(mem);
sysctlbyname("hw.memsize", &mem, &len, NULL, 0);
phys_pages = mem/sysconf(_SC_PAGE_SIZE);
#elif USE_SYSCONF_PHYS_PAGES
phys_pages = sysconf(_SC_PHYS_PAGES);
#else
# error "no way to get phys pages"
#endif
}
return phys_pages;
}