appel système sysinfo ne renvoyant pas la valeur freeram correcte

J’ai récemment écrit le code C suivant en utilisant sysinfo systemcall pour afficher les statistiques du système. Ce qui m’a amusé, c’est que la variable freeram de la structure sysinfo ne renvoie pas la quantité de RAM disponible, mais renvoie l’utilisation actuelle de la RAM. J’ai dû utiliser une solution de contournement pour afficher la valeur correcte en soustrayant freeram de totalram. J’ai essayé de googler à propos de cette variable spécifique mais en vain. Toute compréhension de ce comportement étrange serait vraiment utile.

/* * C program to print the system statistics like system uptime, * total RAM space, free RAM space, process count, page size */ #include  // sysinfo #include  #include  // sysconf #include "syscalls.h" // just contains a wrapper function - error int main() { struct sysinfo info; if (sysinfo(&info) != 0) error("sysinfo: error reading system statistics"); printf("Uptime: %ld:%ld:%ld\n", info.uptime/3600, info.uptime%3600/60, info.uptime%60); printf("Total RAM: %ld MB\n", info.totalram/1024/1024); printf("Free RAM: %ld MB\n", (info.totalram-info.freeram)/1024/1024); printf("Process count: %d\n", info.procs); printf("Page size: %ld bytes\n", sysconf(_SC_PAGESIZE)); return 0; } 

Retirer

 #include "syscalls.h" 

Peut-être, vous avez emprunté le code de quelque part et modifié. Les guillemets doubles permettent d’importer des fichiers d’en-tête non officiels. Ce fichier d’en-tête personnalisé n’est pas vraiment requirejs.

Ce n’est pas nécessaire. Votre code fonctionnera bien.

Sur mon PC, la valeur freeram de $free -m correspond à info.freeram du programme. Apparemment, le freeram n’est pas ce que vous croyez montrer.

En savoir plus sur le http://www.redhat.com/advice/tips/meminfo.html

MemFree est la mémoire libre et MemFree + Tampons + La mémoire cache est la mémoire disponible (que vous voulez). Donc, vous comprenez simplement le terme freeram à tort.

Le champ “bélier gratuit” n’a pas de sens pour la plupart des gens. Ce qui se rapproche le plus d’une véritable valeur “de MemTotal libre” consiste à MemTotal les champs de /proc/meminfo et à soustraire Committed_AS de MemTotal . Le résultat pourrait être négatif si swap est en cours d’utilisation (cela signifie que la quantité de mémoire allouée est supérieure à la capacité du RAM physique). si vous voulez aussi compter swap comme mémoire, utilisez simplement MemTotal+SwapTotal tant que votre total.

vous devez multiplier par mem_unit.