14Fermer16
ThibautLe 02/01/2011 à 18:58
Bonsoir Pen² et vous autres smile

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.