Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Объем памяти, который жрет программа?


Автор: MastEdm 13.1.2009, 18:29
Добрый день. 

Есть ли системная функция, которая возвращает объем памяти, который занимает программа?

Спасибо

Автор: MAKCim 13.1.2009, 22:52
Цитата(MastEdm @  13.1.2009,  18:29 Найти цитируемый пост)
Есть ли системная функция, которая возвращает объем памяти, который занимает программа?

нет
но можно использовать /proc/<pid>/statm

что за память имеется в виду?

Автор: _GRIN_ 28.2.2009, 18:16
MastEdm,  MAKCim прав
в своё время нужна была подобная - вот - держи исходник
Примечание - DLOG - это внутрення функция журналирования - можно на printf() поменять.
Код

//====================================================================
// Global function GetMemoryUsage() - print to log (now to console) info about memory used by this process
//====================================================================
#include <fcntl.h>
int GetMemoryUsage()
{
    int ret_val = 0;
    int NumOfParameters = 10;
    std::string Parameter[] = {"VmPeak","VmSize","VmLck","VmHWM","VmRSS","VmData","VmStk","VmExe","VmLib","VmPTE"};
    unsigned long Value[NumOfParameters];

    char f_name[32];
    sprintf(f_name,"/proc/%u/status",getpid());
    int fd = open(f_name, O_RDONLY);
    if (fd > 0)
    {
        lseek(fd, 0L, SEEK_SET);
        ssize_t num;
        char l_buf[512];
        num = read(fd, l_buf, sizeof(l_buf) - 1);
        if (num > 0)
        {
            l_buf[num]='\0';
            char value[32];
            const char *head,*tail;
            for(int i=0;i<NumOfParameters;i++)
            {
                head = strstr(l_buf,Parameter[i].c_str());
                head = strchr(head,':');
                head++;
                while(*(++head)==' '){};
                tail = strchr(head,' ');
                unsigned long size = (tail - head);
                strncpy(value,head,size);
                value[size]='\0';
                Value[i] = strtoul(value,NULL,10);
            }
#ifdef MEMORY_DEBUG
            std::cout << "\t\t Process's INFO:" << std::endl;
            std::cout << "\t VmPeak: " << Value[0] << std::endl;
            std::cout << "\t VmSize: " << Value[1] << std::endl;
            std::cout << "\t VmLck:  " << Value[2] << std::endl;
            std::cout << "\t VmHWM:  " << Value[3] << std::endl;
            std::cout << "\t VmRSS:  " << Value[4] << std::endl;
            std::cout << "\t VmData: " << Value[5] << std::endl;
            std::cout << "\t VmStk:  " << Value[6] << std::endl;
            std::cout << "\t VmExe:  " << Value[7] << std::endl;
            std::cout << "\t VmLib:  " << Value[8] << std::endl;
            std::cout << "\t VmPTE:  " << Value[9] << std::endl;
#endif
            std::cout << "\t\t Process's Memory Usage INFO:" << std::endl;
            std::cout << "\t All RAM usage for process (inlude: shared library's; data, stack and text segments; resident): " << Value[4]+Value[5]+Value[6]+Value[7]+Value[8] << " kB\n";
            std::cout << "\t RAM for resident only: " << Value[4] << " kB [Peek of RAM for resident: " << Value[3] << " kB]\n";
            std::cout << "\t Virtual memory usage (swap and on the non-swap partitions): " << Value[1] << " kB [Peek is " << Value[0] << " kB]\n";
            std::cout << "\t Size of 'Locked' memory : " << Value[2] << " kB\n";
        }
        else
        {
            DLOG("** err : GetProcessInfo() - couldn't read file");
            ret_val=2;
        }

        if(close(fd) < 0)
        {
            DLOG("** err : GetProcessInfo() - couldn't close file");
            ret_val += 4;
        }
    }
    else
    {
        DLOG("** err : GetProcessInfo() - couldn't open file");
        ret_val=1;
    }
    return ret_val;
}


Автор: MAKCim 1.3.2009, 10:47
_GRIN_, 
хм, а так не проще? 
Код

struct mem_stat
{
    int size;
    int resident;
    int shared;
    int text;
    int data;
};

int get_mem_stat(struct mem_stat *stat, pid_t pid)
{
    char path[128];
    int fake, error;

    sprintf(path, "/proc/%d/statm", pid);

    FILE *fp = fopen(path, "r");

    if (fp == NULL)
        return -1;

    error = fscanf(fp, "%d %d %d %d %d %d %d", &stat->size, &stat->resident, &stat->shared, &stat->text, &fake, &stat->data, &fake);
    
    fclose(fp);

    return error == 7 ? 0 : -1;
}

Автор: _GRIN_ 2.3.2009, 01:05
MAKCim, проще  smile 
когда я писал свой вариант - мне он показался нагляднее (и для себя и для других) - но твой явно проще (по кол-ву операций).

Автор: georain 4.3.2009, 00:10
а гарантируется ли в /proc/<pid>/statm вид структуры на подобии mem_stat?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)