MagPI 6 Page 27

De Le French MagPi
Aller à : Navigation, rechercher

où le fichier sys/sysinfo.h est disponible sous LINUX mais pas sous OSX ni MS Windows. Avant que les informations système ne puissent être récupérées, une variable struct de type sysinfo doit être créée. Ce n'est pas une variable simple, mais une structure contenant plusieurs variables. L'accès aux variables membres du struct se fait grâce à l'opérateur ".". Quand sysinfo est appelée, l'adresse de la variable struct de type sysinfo est passée à la fonction. Cette dernière remplie alors les membres du struct avec le statut.


Dans le dernier exemple de ce tutoriel, gnuplot est utilisé pour tracer l'utilisation de la mémoire en fonction du temps :

(début de code)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/sysinfo.h>
int main() {
  int i, ramUsed;
  char gnuplotCmd[250], systemCmd[350];
  FILE *outPtr = 0;
  char fileName[50];
  sprintf(fileName,"data.txt"); /* Le nom du fichier de sortie. */
  struct sysinfo info; /* Une structure sysinfo pour stocker l'état. */
  outPtr = fopen(fileName,"w"); /* Ouvre le fichier de sortie. */
  if(!outPtr) return 1; /* Renvoie une erreur si le fichier ne peut pas être ouvert. */
  for(i=0;i<60;i++) {
    sysinfo(&info); /* Récupère l'information système */
    ramUsed = info.totalram - info.freeram;
    fprintf(outPtr,"%d %d\n", i, ramUsed); /* Écrit la mémoire utilisée. */ 
    usleep(500000); /* Suspend pendant 1/2 seconde. */
  }
  fclose(outPtr); /* Ferme le fichier de sortie. */
  /* Trace maintenant les données */
  sprintf(gnuplotCmd, "plot \'%s\'\n", filename); /* Construit la commande de traçage. */
  /* Crée la commande complète, y compris le tube vers gnuplot */
  sprintf(systemCmd, "echo \"%s\" | gnuplot --persist",gnuplotCmd);
  system(systemCmd); /* Exécute la commande système. */
  return 0; /* Retourne succès au système. */
}

(fin de code)

où le fichier d'en-tête sys/sysinfo.h est disponible sous LINUX et unistd.h sous LINUX ou OSX. Le programme écrit l'utilisation mémoire dans un fichier de sortie chaque demi-seconde. Ensuite, gnuplot est lancé pour tracer l'utilisation mémoire comme une fonction temporelle.

Le défi

Modifier l'exemple précédent pour écrire un fichier de sortie en utilisant la valeur de retour de la commande hostname pour former le nom du fichier. Tracer ensuite la mémoire utilisée et la charge système pendant l'exécution d'un ou plusieurs autres programmes. Dans la structure sysinfo, le membre loads[3] contient les charges moyennes sur une, cinq et quinze minutes. Essayez d'utiliser,

(début de code)

fprintf(outPtr,"%d %f %d\n", i, ramUsed/10240.0, info.loads[0]);

(fin de code)

pour écrire le fichier de données. Tracez ensuite les valeurs avec les deux lignes,

(début de code)

sprintf(gnuplotCmdOne, "plot \'%s\' using 1:2 title \'%s\'", fileName, "Ram used");
sprintf(gnuplotCmdTwo, ", \'%s\' using 1:3 title \'%s\'\n", fileName, "Load");
/* Création de la commande complète, y compris le tube vers gnuplot */
sprintf(systemCmd,"echo \"%s%s\" | gnuplot -persist",gnuplotCmdOne,gnuplotCmdTwo);

(fin de code)

La solution du problème sera donnée la prochaine fois.

Article de W. H. Bell

Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Boîte à outils