2010-11-19 5 views
1

J'essaye d'écrire un programme simple pour m'avertir quand le RAM est rempli, mais j'ai quelques problèmes avec sysinfo(), le programme d'exemple est en C, I ' Je l'ai attrapé d'un site avec des exemples le code semble être correct, des idées de pourquoi cela peut-il se produire? désolé mon anglais ce n'est pas ma langue maternelle ...C - sysinfo() retournant les mauvaises valeurs i686

Code

est ci-dessous:

/* sysinfo.c by [email protected] 
* 
* Display the uptime, load averages, total ram, free ram, 
* shared ram, buffered ram, total swap, free swap, and 
* number of processes running on a linux machine. 
* 
* http://www.metalshell.com/ 
* 
*/ 

#include <sys/sysinfo.h> 
#include <stdio.h> 

int main() { 
    int days, hours, mins; 
    struct sysinfo sys_info; 

    if(sysinfo(&sys_info) != 0) 
    perror("sysinfo"); 

    // Uptime 
    days = sys_info.uptime/86400; 
    hours = (sys_info.uptime/3600) - (days * 24); 
    mins = (sys_info.uptime/60) - (days * 1440) - (hours * 60); 

    printf("Uptime: %ddays, %dhours, %dminutes, %ldseconds\n", 
         days, hours, mins, sys_info.uptime % 60); 

    // Load Averages for 1,5 and 15 minutes 
    printf("Load Avgs: 1min(%ld) 5min(%ld) 15min(%ld)\n", 
      sys_info.loads[0], sys_info.loads[1], sys_info.loads[2]); 

    // Total and free ram. 
    printf("Total Ram: %ldk\tFree: %ldk\n", sys_info.totalram/1024, 
             sys_info.freeram/1024); 

    // Shared and buffered ram. 
    printf("Shared Ram: %ldk\n", sys_info.sharedram/1024); 
    printf("Buffered Ram: %ldk\n", sys_info.bufferram/1024); 

    // Swap space 
    printf("Total Swap: %ldk\tFree: %ldk\n", sys_info.totalswap/1024, 
              sys_info.freeswap/1024); 

    // Number of processes currently running. 
    printf("Number of processes: %d\n", sys_info.procs); 

    return 0; 
} 
+0

http://www.metalshell.com/source_code/114/Sysinfo.html – kainlite

+0

dans ce lien est le code source ... – kainlite

+5

Quels problèmes rencontrez-vous? Qu'est-ce qui ne fonctionne pas correctement? –

Répondre

3

Après ce que vous relisant essayez d'utiliser sysinfo et lire la page de manuel pour sysinfo J'ai une idée de ce que pourrait vous déranger à propos de ses résultats. Si ce n'est pas votre problème, alors vous devrez poster plus (comme la sortie réelle du programme ci-dessus et des commentaires sur ce qui ne va pas et pourquoi vous pensez que c'est faux).

Les anciennes versions de Linux avaient une version différente de sysinfo qui était très similaire à la version actuelle, mais pas compatible avec celle-ci. Il y avait quelques champs ajoutés à sa structure ainsi qu'une légère modification de la signification des champs de mémoire. Ces champs doivent maintenant être interprétés avec le champ mem_unit. En effet, il est possible que certaines machines aient plus de mémoire que ce qui peut être exprimé dans un entier long.

Ce type de situation est devenu assez courant sur les processeurs 32 bits x86 où plus de 2^32 (4 Go) de RAM étaient installés sur certaines machines. Je suppose que cela peut être votre problème puisque votre programme ne mentionne pas du tout mem_unit.

Je pense que si vous essayez:

printf("Total Ram: %lluk\tFree: %lluk\n", 
       sys_info.totalram *(unsigned long long)sys_info.mem_unit/1024, 
       sys_info.freeram *(unsigned long long)sys_info.mem_unit/ 1024); 

Ensuite, cette ligne peut commencer à produire une sortie qui est plus logique pour vous. Un changement similaire sur les autres lignes qui traitent de RAM devrait également les rendre plus logique.

+0

Désolé, je suis nouvelle programmation en C et c'est ma première question, je vais prendre vos conseils pour l'affichage futur, que les lignes impriment la taille réelle de ma machine, comme vous l'avez dit, j'ai installé 4GB et mon système fonctionne avec un Ubuntu 32_x86 . avec cette mission tout fonctionne bien :) Je suis sûr que ce post sera utile pour quelqu'un d'autre aussi ... – kainlite

+0

@kainlite: Il aurait été très facile de faire cette erreur sur la base de l'ancienne documentation ou d'un ancien exemple de programme depuis le interface modifiée. – nategoose

Questions connexes