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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Узнать загрузку CPU по PID 
:(
    Опции темы
Vit
Дата 17.1.2005, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

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



Как? Нужна цифирь на подобии той которую выдаёт top




--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
dargaard
Дата 18.1.2005, 03:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Можно посмотреть в /proc/nomer/status и пропарсить.



--------------------
Ты должна сделать добро из зла 
потому что его больше не из чего
сделать. Р.П.Уоррен
PM MAIL WWW ICQ   Вверх
Vit
Дата 18.1.2005, 05:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

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



Цитата(dargaard @ 17.1.2005, 18:35)
пропарсить



Пример конкретней можно? Какую цифирь по номеру взять и как её до божеского вида довести?


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
dargaard
Дата 18.1.2005, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В обшем после нескольких часов (самому стало интерсноsmile ) вот что нашел:
в /proc/pid/stat поля 14 и 15 отвечают за юзерное и системное время выполнения процесса.
Чтоб получить какую нить статистику по загруженности компа надо хоть немного замерить его - т.е. надо просмотреть фаил хотя бы в течении некоторого времени.
Раз в секунду максимум поля могут изменится на 100 единиц.

Вот пример проги: пробовал на разных загруженностях и сравнивал с top-ом. вроде почти всегда совпадает. Писалось на скорую руку, абы работало, так что сильно не пеняйте (там нет никаких проверок на то что процесс который мы мониторим умер, и т.д.)

Так как проверял я раз в секунду то не начто делить полученный результат не надо было. Если проверить фаил раз в 0.5 секунд соответсвенно dff1, diff2 надо поделить на 2, и т.д.
Код

#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char **argv) {
       if (argc==1) {
               printf("./a.out <pid>\n");
               return 0;
       }
       int pid;
       pid = atoi(argv[1]);
       printf("pid is %d\n",pid);
       char buf[200];
       strcpy(buf,"/proc/");
       strcat(buf,argv[1]);
       strcat(buf,"/stat");

                int fd = open(buf,O_RDONLY);
       if (fd<=0) {
               printf("No such process\n"); return 0;
       }
               char data[1000];
               char *s;
               int systime=-1;
               int usertime=-1;
               int oldsystem=-1;
               int olduser=-1;
       do {

               int rc=read(fd,data,1000);
               data[rc]='\0';
               //printf("%s\n",data);
               lseek(fd,SEEK_SET,0);
               s=(char*)strtok(data, " ");
               int k=0;

//Глупо так парсить,зато легко:)
               while(s) {
                       k++;
                       s=strtok(0," ");

                       if (k==14) {
                               oldsystem = systime;
                               systime = atoi(s);
                       }
                       if (k==13) {
                               olduser = usertime;
                               usertime= atoi(s);
                       }
               }

           
               if (olduser!=-1) {
               int diff1 = usertime-olduser;
               int diff2= systime - oldsystem;
               printf("%d%%\n",(usertime-olduser));
               printf("%d%%\n",(systime-oldsystem));
               printf("Total %d\n",(diff1+diff2));
               }
               sleep(1);
       } while (1);
}


Дополнительную инфу можно наити в man proc

P.S. Будет работать не на всех системах (например на солярисе не пашет - там довольно другая система). При большом желании можно посмотреть исходники top-a



--------------------
Ты должна сделать добро из зла 
потому что его больше не из чего
сделать. Р.П.Уоррен
PM MAIL WWW ICQ   Вверх
Vit
Дата 18.1.2005, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

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



Спасибо


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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