كيف يمكنك تحديد مقدار لينكس نظام ذاكرة الوصول العشوائي في C++?

StackOverflow https://stackoverflow.com/questions/349889

  •  20-08-2019
  •  | 
  •  

سؤال

أنا فقط كتبت التالية C++ وظيفة برمجيا تحديد مقدار ذاكرة الوصول العشوائي نظام تثبيت.يعمل, ولكن يبدو لي أنه ينبغي أن يكون هناك طريقة أسهل للقيام بذلك.يمكن أن تقولوا لي إذا أنا في عداد المفقودين شيئا ؟

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;
}

أولا أنا باستخدام popen("head -n1 /proc/meminfo") للحصول على السطر الأول من meminfo ملف من النظام.الناتج من هذا الأمر يبدو

MemTotal:775280 kB

مرة واحدة كنت قد حصلت على هذا الانتاج في istringstream, انها بسيطة tokenize إلى الحصول على المعلومات التي أريدها.سؤالي هو هل هناك طريقة أبسط قراءة في إخراج هذا الأمر ؟ هل هناك معيار C++ مكتبة الدعوة إلى قراءة في كمية من نظام ذاكرة الوصول العشوائي ؟

هل كانت مفيدة؟

المحلول

على لينكس ، يمكنك استخدام وظيفة sysinfo الذي يحدد القيم التالية البنية:

   #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 */
   };

إذا كنت تريد أن تفعل ذلك فقط باستخدام وظائف C++ (أود أن التمسك sysinfo) أنا نوصي بأخذ C++ باستخدام نهج std::ifstream و 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
}

نصائح أخرى

ليس هناك حاجة لاستخدام popen(), يمكنك قراءة الملف بنفسك.أيضا ، إذا كان هناك الخط الأول ليس هو ما تبحث عنه, سوف تفشل ، منذ head -n1 فقط يقرأ السطر الأول ثم يخرج.لست متأكدا لماذا أنت خلط C و C++ I/O مثل ذلك ؛ أنها على ما يرام تماما لكن ربما يجب عليك أن تختار أن تذهب كل ج أو كل C++.ربما كنت تفعل شيئا من هذا القبيل:

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;
}

تذكر /proc/meminfo هو مجرد ملف.فتح ملف قراءة السطر الأول في الملف.Voilá!

حتى top (من procps) يوزع /proc/meminfo, انظر هنا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top