Bonsoir Pen² et vous autres
Si tu as eu une pause pour les fêtes de fin d'année qui remet à plus tard la mise en pratique de ce qui a été écrit ci-dessus, voici une fonction toute faite :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static const char MEMFREE[] = "MemFree:";
static const char BUFFERS[] = "Buffers:";
static const char CACHED[] = "Cached:";
static const char SWAPFREE[]= "SwapFree:";
long long get_free_memory(void) {
void *eof;
FILE *meminfo;
long long result;
char line[256];
char *size;
meminfo= fopen("/proc/meminfo", "r");
if (meminfo == NULL) return (-1);
do eof= fgets(line, 255, meminfo); while (eof != NULL && strncmp(line, MEMFREE, sizeof(MEMFREE)-1) != 0);
if (eof == NULL) {fclose(meminfo); return (-1);}
size= &line[sizeof(MEMFREE)-1];
while (*size != 0 && (*size < '0' || *size > '9')) size++;
result= 1024*atol(size);
do eof= fgets(line, 255, meminfo); while (eof != NULL && strncmp(line, BUFFERS, sizeof(BUFFERS)-1) != 0);
if (eof == NULL) {fclose(meminfo); return (-1);}
size= &line[sizeof(BUFFERS)-1];
while (*size != 0 && (*size < '0' || *size > '9')) size++;
result+= 0.98*1024*atol(size);
do eof= fgets(line, 255, meminfo); while (eof != NULL && strncmp(line, CACHED, sizeof(CACHED)-1) != 0);
if (eof == NULL) {fclose(meminfo); return (-1);}
size= &line[sizeof(CACHED)-1];
while (*size != 0 && (*size < '0' || *size > '9')) size++;
result+= 0.98*1024*atol(size);
do eof= fgets(line, 255, meminfo); while (eof != NULL && strncmp(line, SWAPFREE, sizeof(SWAPFREE)-1) != 0);
if (eof == NULL) {fclose(meminfo); return (-1);}
size= &line[sizeof(SWAPFREE)-1];
while (*size != 0 && (*size < '0' || *size > '9')) size++;
result+= 1024*atol(size);
fclose(meminfo);
return (result);
}
Toute reprise sauvage est possible. D'ailleurs il y a sans doute des améliorations à apporter :
- c'est un peu lent,
- si un caractère change dans les chaînes, ça se pète la gueule,
- l'unité des valeurs de
/proc/meminfo est le ko et si ça change, pouf,
- par sécurité, je considère que les buffers ne sont pas entièrement vidables, qu'il doit leur rester arbitrairement 2% de leur taille.
Si quelqu'un a mieux et que c'est libre, je prends.