diff options
author | 諏訪子 <suwako@076.moe> | 2024-06-18 00:16:45 +0900 |
---|---|---|
committer | 諏訪子 <suwako@076.moe> | 2024-06-18 00:16:45 +0900 |
commit | 11c97887ef28e9b073d9abf1c2da70cd01491c9e (patch) | |
tree | 41c7b4d79d99733b879f6c63c8c731484022fc7e /src/memory.c | |
parent | 3d418e666955695052d25e32c6b2f296b7af6859 (diff) |
メモリ
Diffstat (limited to 'src/memory.c')
-rw-r--r-- | src/memory.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/memory.c b/src/memory.c new file mode 100644 index 0000000..833fa97 --- /dev/null +++ b/src/memory.c @@ -0,0 +1,52 @@ +#include "memory.h" + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +long long int run_mem_command(const char *command) { + char buf[128]; + long long int res = 0; + + FILE *p = popen(command, "r"); + if (!p) { + fprintf(stderr, "ホストコマンドを実効に失敗: %s", command); + return 0; + } + + while (fgets(buf, sizeof(buf), p) != NULL) { + buf[strcspn(buf, "\n")] = '\0'; + } + + res = atoll(buf); + pclose(p); + + return res; +} + +void display_memory() { + long long int memused = 0; + long long int memtotal = 0; +#if defined(__OpenBSD__) + memused = run_mem_command("vmstat | awk 'END {printf $3}' | sed 's/M//'"); + memtotal = run_mem_command("sysctl -n hw.physmem") / 1024LL / 1024LL; +#elif defined(__FreeBSD__) || defined(__DragonFly__) + memtotal = run_mem_command("sysctl -n hw.physmem") / 1024LL / 1024LL; +#elif defined(__NetBSD__) + memused = run_mem_command("top | grep \"Memory:\" | awk '{print $2}' | " + "sed 's/M//'"); + memtotal = run_mem_command("sysctl -n hw.physmem64") / 1024LL / 1024LL; +#elif defined(__minix) + memtotal = run_mem_command("sysctl -n hw.physmem") / 1024LL / 1024LL; +#elif defined(__linux__) + long long int memaval = run_mem_command("cat /proc/meminfo | grep MemAvailable | " + "awk '{print $2}'") / 1024LL; + memtotal = run_mem_command("cat /proc/meminfo | grep MemTotal | " + "awk '{print $2}'") / 1024LL; + memused = memtotal - memaval; + /* memused = run_mem_command("cat /proc/meminfo | grep MemFree | " + "awk '{print $2}'") / 1024LL; */ +#endif + + printf("%lld MiB / %lld MiB", memused, memtotal); +} |