Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объем памяти, который жрет программа? 
:(
    Опции темы
MastEdm
Дата 13.1.2009, 18:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Master
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 3.12.2005
Где: Москва, МГИУ

Репутация: нет
Всего: 2



Добрый день. 

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

Спасибо
PM MAIL   Вверх
MAKCim
Дата 13.1.2009, 22:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



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

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

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
_GRIN_
Дата 28.2.2009, 18:16 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: нет
Всего: 7



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




--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
MAKCim
Дата 1.3.2009, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



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



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
_GRIN_
Дата 2.3.2009, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: нет
Всего: 7



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


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
georain
Дата 4.3.2009, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 28.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



а гарантируется ли в /proc/<pid>/statm вид структуры на подобии mem_stat?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0458 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.