Frage

Ich schrieb die folgende C ++ Funktion programmatisch zu bestimmen, wie viel RAM ein System installiert hat. Es funktioniert, aber es scheint mir, dass es ein einfacherer Weg, dies zu tun. Kann mir jemand sagen, ob ich etwas fehlt?

getRAM()
{
    FILE* stream = popen( "head -n1 /proc/meminfo", "r" );
    std::ostringstream output;
    int bufsize = 128;

    while( !feof( stream ) && !ferror( stream ))
    {
        char buf[bufsize];
        int bytesRead = fread( buf, 1, bufsize, stream );
        output.write( buf, bytesRead );
    }
    std::string result = output.str();

    std::string label, ram;
    std::istringstream iss(result);
    iss >> label;
    iss >> ram;

    return ram;
}

Erstens, ich bin popen("head -n1 /proc/meminfo") mit der ersten Zeile der meminfo Datei aus dem System zu erhalten. Die Ausgabe dieses Befehls sieht aus wie

  

MemTotal: 775.280 kB

Nachdem ich diese Ausgabe in einem istringstream haben, es einfach ist es tokenize auf die Informationen zu bekommen was ich will. Meine Frage ist, gibt es eine einfachere Art und Weise in der Ausgabe dieses Befehls zu lesen? Gibt es einen Standard C ++ Bibliothek Anruf in der Menge des System-RAM zu lesen?

War es hilfreich?

Lösung

Unter Linux können Sie die Funktion sysinfo verwenden, die Werte in der folgenden Struktur setzt:

   #include <sys/sysinfo.h>

   int sysinfo(struct sysinfo *info);

   struct sysinfo {
       long uptime;             /* Seconds since boot */
       unsigned long loads[3];  /* 1, 5, and 15 minute load averages */
       unsigned long totalram;  /* Total usable main memory size */
       unsigned long freeram;   /* Available memory size */
       unsigned long sharedram; /* Amount of shared memory */
       unsigned long bufferram; /* Memory used by buffers */
       unsigned long totalswap; /* Total swap space size */
       unsigned long freeswap;  /* swap space still available */
       unsigned short procs;    /* Number of current processes */
       unsigned long totalhigh; /* Total high memory size */
       unsigned long freehigh;  /* Available high memory size */
       unsigned int mem_unit;   /* Memory unit size in bytes */
       char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding for libc5 */
   };

Wenn Sie es tun wollen nur Funktionen von C ++ (ich würde halten Sie sich an sysinfo), empfehle ich eine C ++ Ansatz std::ifstream und std::string:

unsigned long get_mem_total() {
    std::string token;
    std::ifstream file("/proc/meminfo");
    while(file >> token) {
        if(token == "MemTotal:") {
            unsigned long mem;
            if(file >> mem) {
                return mem;
            } else {
                return 0;       
            }
        }
        // ignore rest of the line
        file.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
    return 0; // nothing found
}

Andere Tipps

Es gibt keine Notwendigkeit popen() zu verwenden, können Sie einfach die Datei selbst lesen. Auch wenn es erste Zeile ist nicht das, was Sie suchen, werden Sie scheitern, da head -n1 nur die erste Zeile liest und dann beendet. Ich bin mir nicht sicher, warum Sie C und C ++ I / O wie das abmischen; es ist vollkommen in Ordnung, aber man sollte wahrscheinlich alle C oder alle C ++ gehen entscheiden. Ich würde es wahrscheinlich etwas tun, wie folgt aus:

int GetRamInKB(void)
{
    FILE *meminfo = fopen("/proc/meminfo", "r");
    if(meminfo == NULL)
        ... // handle error

    char line[256];
    while(fgets(line, sizeof(line), meminfo))
    {
        int ram;
        if(sscanf(line, "MemTotal: %d kB", &ram) == 1)
        {
            fclose(meminfo);
            return ram;
        }
    }

    // If we got here, then we couldn't find the proper line in the meminfo file:
    // do something appropriate like return an error code, throw an exception, etc.
    fclose(meminfo);
    return -1;
}

Speichern / proc / meminfo nur eine Datei ist. Öffnen Sie die Datei, lesen Sie die erste Zeile, die Datei zu schließen. Voila!

Auch top (von procps) parst /proc/meminfo finden Sie unter hier .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top