>Привет!
>Мне очень нужно получить в своей программе загрузку процессора и памяти...
>Может кто-то уже имеет подобный код? (С++)
>Так же подойдет скрипт баш, который нормально это выдергивает из необходимых утилит...
>
>
>Спасибо большое...
>Извините, если что-то не так сказал, но надеюсь, что общий смысл ясен
>Сталкивался с такой задачкой. Даю 2 функции.
/* функция возвращает загрузку процессора в процентах независимо от кол-ва ядер (у меня 2 ядра, функция работает корректно)*/
//int getcpuusage(cpu_options *opts)
int getcpuusage()
{
static int *pid_list;
static int pids;
static int pre_used, pre_total;
static int pre_ig_used;
int usage;
int cpu, nice, system, idle;
int used = 0, total = 0;
int ig_used = 0;
int i;
cpu_options *opts;
opts->ignore_nice = false;
opts->cpu_number = -1;
opts->ignore_procs = 0;
FILE *fp;
if (!(fp = fopen("/proc/stat", "r"))) {
perror("can't open /proc/stat");
exit(1);
}
fscanf(fp, "%*s %d %d %d %d", &cpu, &nice, &system, &idle);
#ifdef USE_SMP
if (opts->cpu_number >= 0) {
char cpu_name[20];
if (opts->cpu_number > NR_CPUS - 1) {
fprintf (stderr, "MAX CPU number that can be running in SMP is %d\n", NR_CPUS - 1);
exit(1);
}
for (i = 0; i <= opts->cpu_number; i++) {
fscanf(fp, "%s %d %d %d %d", cpu_name, &cpu, &nice, &system, &idle);
if (strncmp(cpu_name, "cpu", 3)){
fprintf (stderr, "can't find cpu%d!\n", opts->cpu_number);
exit (1);
}
}
}
#endif /* USE_SMP */
fclose(fp);
used = cpu + system;
if (!opts->ignore_nice)
used += nice;
total = cpu + nice + system + idle;
/* calc CPU usage */
if ((pre_total == 0) || !(total - pre_total > 0)) {
usage = 0;
} else if (ig_used - pre_ig_used > 0) {
usage = (100 * (double)(used - pre_used - ig_used + pre_ig_used)) /
(double)(total - pre_total);
} else {
usage = (100 * (double)(used - pre_used)) / (double)(total - pre_total);
}
/* save current values for next calculation */
pre_ig_used = ig_used;
pre_used = used;
pre_total = total;
return usage;
}
/*функция возвращает иформацию о доступной и занятой памяти. */
struct sysinfo getmeminfo ()
/*
функция возвращает структуру с описнием ресурсов памяти
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: libc5 uses this..
};
*/
{
struct sysinfo si;
sysinfo(&si);
return si;
}
---------------------------------------------------
Что касаемо памяти, тут есть одна проблемка. Linux старается потребить всю свободную память под различные буфера устройств итп. Так что то, что тебе возвратится в структуре в поле freeram не совсем правда. Для того что бы получить реальное кол-во свободной памяти, сделай следующее: freeram - bufferram.