IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

statvfs : Informations système Linux


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Par défaut statvfs : Informations système Linux
    Bonjour.

    Je souhaite obtenir des informations sur mes partitions Linux. Des informations telles que :
    - Espace total
    - Espace libre
    - Espace utilisé
    - ...

    Pour ceci, j'utilise ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    void disk_space(char *path)
    {
      struct statvfs fiData;
    
      if((statvfs(path,&fiData)) < 0 )
      {
        printf("Failed to stat %s:\n", path);
      }
      else
      {
            printf("Disk %s: \n", path);
            printf("block size: %u\n", fiData.f_bsize);
            printf("total no blocks: %i\n", fiData.f_blocks);
            printf("free blocks: %i\n", fiData.f_bfree);
            printf("free blocks (for non-root): %i\n", fiData.f_bavail);
    
            float totalspace=((float) fiData.f_bsize)*((float) fiData.f_blocks);
            float freespace=((float) fiData.f_bsize)*((float) fiData.f_bavail);
    
            printf("Free space:%.2fMB, %.2fGB,\n",freespace/(1024.0*1024.0),freespace/(1024.0*1024.0*1024.0));
            printf("Total space: %.2fMB, %.2fGB,\n", totalspace/(1024.0*1024.0),totalspace/(1024.0*1024.0*1024.0));
        }
    }
    
    int main(int argc, char *argv[])
    {
    
        disk_space("/dev/sda1");
    
       return 0,;
    }
    Mon problème, c'est que j'obtiens toujours le même résultat, quelque soit la partition analysée :

    Starting /home/pierre/Documents/C++/infos_hdd/infos_hdd...
    Disk /dev/sda1:
    block size: 4096
    total no blocks: 128996
    free blocks: 128311
    free blocks (for non-root): 128311
    Free space:501,21MB, 0,49GB,
    Total space: 503,89MB, 0,49GB,
    Sachant que mon /dev/sda1 équivaut a mon /home, si je fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main(int argc, char *argv[])
    {
    
        disk_space("/home");
    
       return 0,;
    }
    'obtiens des résultats valides :

    Starting /home/pierre/Documents/C++/infos_hdd/infos_hdd...
    Disk /home:
    block size: 4096
    total no blocks: 8410362
    free blocks: 7999085
    free blocks (for non-root): 7571857
    Free space:29577,57MB, 28,88GB,
    Total space: 32852,98MB, 32,08GB,
    Je ne vois pas d'ou vient le problème ? Comment obtenir ces informations depuis le nom de mes partitions (/dev/sdaX), et non pas depuis leur point de montage ?

    Cordialement,
    PKO

    Edit :

    Pour information, j'ai fait un second test, cette fois avec le methode fopen :

    Ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        FILE* fp = NULL;
     
        fp = fopen("/dev/sda1","rb" );
        if( fp != NULL )
            cout<<"OK" <<endl;
        else
            cout<<"KO" <<endl;
     
        fclose( fp );
    Fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        FILE* fp = NULL;
     
        fp = fopen("/home","rb" );
        if( fp != NULL )
            cout<<"OK" <<endl;
        else
            cout<<"KO" <<endl;
     
        fclose( fp );
    A défaut de me servir de /dev/sda, y'a t'il un moyen d'obtenir la relation partition -> point de montage ?

    Merci.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Par défaut
    En ce qui concerne le "fopen", j'ai réussi à résoudre le problème.
    Il suffit pour cela de lancer le programme en root, sinon les droits ne sont pas suffisant.

    par contre, pour le statfs, toujours le même problème. Je n'arrive pas a obtenir les informations relatives aux espaces (libre/utilisé/total/...) a partir du nom des partitions (/dev/sda1 par exemple).

    De quelle manière puis-je m'y prendre pour lire ces informations ?

    Cordialement,
    PKO

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Par défaut
    Bonjour,

    J'ai trouvé la solution depuis.
    Il est en fait nécessaire de monter les partitions, et d'utiliser non pas la partition elle même, mais le point de montage. Ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    disk_space("/media/sda1");
    Ici, j'ai monté ma partition /dev/sda1 dans /media/sda, et en m'adressant a ce point de montage, mes valeurs sont correctes.

    Cordialement,
    PKO

  4. #4
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 120
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 120
    Par défaut Déterrage
    Bonsoir,

    oui, je sais, ce post a 4 ans, , mais il a été marqué , alors si ça peut aider quelqu'un qui cherche, j'apporte mon grain de sel :
    Citation Envoyé par Altess Voir le message
    (...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    float totalspace=((float) fiData.f_bsize)*((float) fiData.f_blocks);
    float freespace= ((float) fiData.f_bsize)*((float) fiData.f_bavail);
    (...)
    J'ai pu constater que les résultats étaient meilleurs en remplaçant float par double :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double totalspace =((double) fiData.f_bsize)*((double) fiData.f_blocks);
    double freespace = ((double) fiData.f_bsize)*((double) fiData.f_bavail); // f_bavail !
    Bien sûr il faudra adapter les printf qui suivent.

    Et si l'on veut aussi l'espace occupé, ce n'est pas un bête totalspace - freespace qu'il faut faire, ça serait trop simple
    Si l'on souhaite que les résultats ressemblent à ceux de df (à tester avec df -B1), il faut une troisième variable,
    style double usedspace = totalspace - ((double) fiData.f_bsize * (double) fiData.f_bfree); // f_bfree !.

    Notez la différence d'utilisation de f_bavail et f_bfree, à voir avec man statvfs.
    Mais c'est pas très clair (pour moi).

    Un dernier mot : pour faire mes tests, je comparais la sortie de df -B1 avec celle de ce petit prog., dans un terminal où je rappelais rapidement les commandes ;
    j'ai pu constater que parfois les résultats n'étaient pas identiques La solution consistait alors à... attendre un peu !
    Une histoire de sync ? De flush ? Ma foi...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Informations Système en C++ Windows/Linux
    Par Hantse dans le forum Langage
    Réponses: 2
    Dernier message: 11/12/2011, 14h08
  2. Caractérisation de la morphologie d'un système Linux
    Par Hibou57 dans le forum Distributions
    Réponses: 20
    Dernier message: 10/07/2006, 23h06
  3. Réponses: 6
    Dernier message: 04/06/2006, 01h49
  4. Récupérer certaines informations système
    Par Leobaillard dans le forum Composants VCL
    Réponses: 13
    Dernier message: 23/12/2005, 10h54
  5. Informations système ?
    Par Neilos dans le forum Windows
    Réponses: 3
    Dernier message: 12/08/2005, 15h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo