Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
[c] librairies et fonctions d'informations (2) ?
Envoyé par: francoisp

Je voudrai recuperer plus d'info sur la machine avec ce petit code :

#include <linux/kernel.h>
#include <linux/sys.h>
#include <sys/sysinfo.h>
#include <sys/utsname.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

float get_cpu_clock_speed ()
{
  FILE* fp;
  char buffer[1024];
  size_t bytes_read;
  char* match;
  float clock_speed;

  /* Charge le contenu de /proc/cpuinfo dans le tampon. */
  fp = fopen ("/proc/cpuinfo", "r");
  bytes_read = fread (buffer, 1, sizeof (buffer), fp);
  fclose (fp);
  /* Traite le cas où la lecture échoue ou le buffer est trop petit. */
  if (bytes_read == 0 || bytes_read == sizeof (buffer))
    return 0;
  /* Place un caractère nul à la fin de la chaîne. */
  buffer[bytes_read] = "\0";
  /* Recherche la ligne commençant par "cpu MHz". */
  match = strstr (buffer, "cpu MHz");
  if (match == NULL)
    return 0;
  /* Analyse la ligne pour extraire la vitesse d'horloge. */
  sscanf (match, "cpu MHz : %f", &clock_speed);
  return clock_speed;
}

int main ()
{
  /* info archi */
struct utsname utsname;
long sysconf_return;
if (uname(&utsname) == -1 )
{
        perror("uname()");
        // en cas d'erreur d'analyse du systeme
}
else
{
        printf("Processeur \t\t: %s\n", utsname.machine);
        printf ("CPU clock speed\t\t: %4.0f MHz\n", get_cpu_clock_speed ());
        printf("Systeme    \t\t: %s %s (%s)\n", utsname.sysname, utsname.release, utsname.version);
}
sysconf_return = sysconf(_SC_VERSION);
if (sysconf_return != -1)
{
        // si on est comptible posix afficher la norme utilisee
        printf("Compatible POSIX %ld\n", sysconf_return);
}
  /* Facteurs de conversion. */
const long minute = 60;
const long hour = minute * 60;
const long day = hour * 24;
const double megabyte = 1024 * 1024;
  /* Récupère les statistiques système. */
struct sysinfo si;
          sysinfo (&si);
/* Affiche un résumé des informations intéressantes. */
        printf ("uptime système \t\t: %ld jours, %ld:%02ld:%02ld\n",
          si.uptime / day, (si.uptime % day) / hour,
          (si.uptime % hour) / minute, si.uptime % minute);
        printf ("RAM totale    \t\t: %5.1f Mo\n", si.totalram / megabyte);
        printf ("RAM libre     \t\t: %5.1f Mo\n", si.freeram / megabyte);
        printf ("nb processus  \t\t: %d\n", si.procs);
        return EXIT_SUCCESS ;
}

ou dois je chercher quelles fonctions/librairies dois je appeler pour avoir plus d'info sur le systeme ?

TEST-FRSP:~/tmp/c # gcc -Wall -O9 system.c -o system && strip system
TEST-FRSP:~/tmp/c # ./system
Processeur              : i686
CPU clock speed         :  548 MHz
Systeme                 : Linux 2.6.18.2-34-test (#1 Fri Jun 29 17:22:54 CEST 2007)
Compatible POSIX 200112
uptime système          : 19 jours, 11:09:31
RAM totale              : 503.7 Mo
RAM libre               :  17.5 Mo
nb processus            : 232

Poste le Saturday 30 June 2007 11:38:32
Répondre     Citer    
Re: [c] librairies et fonctions d'informations (2) ?
Envoyé par: Sve@r

Citation
francoisp
Je voudrai recuperer plus d'info sur la machine
avec ce petit code :

#include <linux/kernel.h>
#include <linux/sys.h>
#include <sys/sysinfo.h>
#include <sys/utsname.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

float get_cpu_clock_speed ()
{
FILE* fp;
char buffer[1024];
size_t bytes_read;
char* match;
float clock_speed;

/* Charge le contenu de /proc/cpuinfo dans le
tampon. */
fp = fopen ("/proc/cpuinfo", "r");
bytes_read = fread (buffer, 1, sizeof (buffer),
fp);
fclose (fp);
/* Traite le cas où la lecture échoue ou le
buffer est trop petit. */
if (bytes_read == 0 || bytes_read == sizeof
(buffer))
return 0;
/* Place un caractère nul à la fin de la chaîne.
*/
buffer = "\0";
/* Recherche la ligne commençant par "cpu MHz".
*/
match = strstr (buffer, "cpu MHz");
if (match == NULL)
return 0;
/* Analyse la ligne pour extraire la vitesse
d'horloge. */
sscanf (match, "cpu MHz : %f",
&clock_speed);
return clock_speed;
}

int main ()
{
/* info archi */
struct utsname utsname;
long sysconf_return;
if (uname(&utsname) == -1 )
{
perror("uname()");
// en cas d'erreur d'analyse du systeme
}
else
{
printf("Processeur \t\t: %s\n",
utsname.machine);
printf ("CPU clock speed\t\t: %4.0f
MHz\n", get_cpu_clock_speed ());
printf("Systeme \t\t: %s %s (%s)\n",
utsname.sysname, utsname.release,
utsname.version);
}
sysconf_return = sysconf(_SC_VERSION);
if (sysconf_return != -1)
{
// si on est comptible posix afficher la
norme utilisee
printf("Compatible POSIX %ld\n",
sysconf_return);
}
/* Facteurs de conversion. */
const long minute = 60;
const long hour = minute * 60;
const long day = hour * 24;
const double megabyte = 1024 * 1024;
/* Récupère les statistiques système. */
struct sysinfo si;
sysinfo (&si);
/* Affiche un résumé des informations
intéressantes. */
printf ("uptime système \t\t: %ld jours,
%ld:%02ld:%02ld\n",
si.uptime / day, (si.uptime % day) /
hour,
(si.uptime % hour) / minute, si.uptime %
minute);
printf ("RAM totale \t\t: %5.1f Mo\n",
si.totalram / megabyte);
printf ("RAM libre \t\t: %5.1f Mo\n",
si.freeram / megabyte);
printf ("nb processus \t\t: %d\n",
si.procs);
return EXIT_SUCCESS ;
}

ou dois je chercher quelles fonctions/librairies
dois je appeler pour avoir plus d'info sur le
systeme ?

TEST-FRSP:~/tmp/c # gcc -Wall -O9 system.c -o
system && strip system
TEST-FRSP:~/tmp/c # ./system
Processeur : i686
CPU clock speed : 548 MHz
Systeme : Linux 2.6.18.2-34-test
(#1 Fri Jun 29 17:22:54 CEST 2007)
Compatible POSIX 200112
uptime système : 19 jours, 11:09:31
RAM totale : 503.7 Mo
RAM libre : 17.5 Mo
nb processus : 232

Chapeau pour ton code. Il dénote le professionnel. Et ça fait plaisir de voir que tu es bien conscient que 1Mo font 1024ko et non 1000 (comme font encore semblants de le croire les fabriquants de disques durs). Bon, décomposer les heures et miutes aussi profondément n'est peut-être pas vraiment nécessaire (une heure fera toujours 60 minutes) mais cela n'enlève rien au reste.

Juste une petite erreur
Citation
francoisp
/* Place un caractère nul à la fin de la chaîne. */
  buffer[bytes_read] = "\0";

Un caractère n'est pas une chaîne !!!
/* Place un caractère nul à la fin de la chaîne. */
  buffer[bytes_read] = '\0';

Sinon je ne connais pas de fonction te permettant d'interroger en profondeur l'état du système. Essaye de regarder le programme "top" voire retrouver ses sources pour examiner ce qu'il utilise, ça peut t'être utile...

L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Saturday 30 June 2007 14:14:13
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
[c] librairies et fonctions d'informations (2) ?
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons