#include #include #include /* http://eic.sourceforge.net/documentation/node141.html Paprasciau yra naudotissiomis funkcijomis - trumpiau viskas daroma; tuo tarpu sita include faila galima rasti praktiskai kiekvienoje linux sistemoje. */ #include /* sitas reikalingas laisvos disko vietos atsekimui */ #define UPDATE_DELAY 1 /* intervalas kas kiek gausime duomenis, vertetu pagalvoti ar jo nereikia padaryti tokio pat kaip ir www refresho */ static int pstat; void getload(void); void gethdd(void); void main() { pstat = open("/proc/stat", O_RDONLY); if(pstat == -1) perror("Nepavyko atidaryti /proc/stat"), exit(1); while(1) { getload(); gethdd(); sleep(UPDATE_DELAY); } } void getload(void) { int len, status; int user, nice, system, idle; static int prev_user, prev_nice, prev_system, prev_idle; int delta_user, delta_nice, delta_system, delta_idle; int full, load, userl; float prcf, prcu; char buf[1000], dummy[50]; /* tiesa sakant, tiek kintamuju niekam nereikia. Daug efektyviau galima perdaryti viska apdorojant masyvo viduje bet tada kodas pakankamai sunkiai skaitomas gausis tuo tarpu dabar galima pasiimti bet kuria reiksme ir naudoti i sveikata - tiek idle, tiek.... */ lseek(pstat, 0, SEEK_SET); len = read(pstat, buf, sizeof(buf)); buf[len] = 0; status = sscanf(buf, "%s %d %d %d %d", dummy, &user, &nice, &system, &idle); if(status == EOF) perror("sscanf /proc/stat"), exit(1); if(status != 5) fprintf(stderr, "sscanf /proc/stat grazino %d\n", status), exit(1); /* situ DABAR mums nereikia, bet jei butu reikalas - galima panaudoti "prie ukio" printf("CPU: idle=%d user=%d nice=%d system=%d\n", idle, user, nice, system); */ delta_idle=idle-prev_idle; delta_user=user-prev_user; delta_nice=nice-prev_nice; delta_system=system-prev_system; /* Va cia skaitine reiksme. rgi siuo metu nereikalinga, bet paliekam "o jei reikes" - grazina skaitines delta reiksmes printf("CPU1: idle=%d user=%d nice=%d system=%d\n",delta_idle,delta_user,delta_nice,delta_system); */ /* dabar velgi neaisku ko reikia is tikruju jei tik bendro sistemos apkrovimo tada uztenka percentage reiksmes; tuo tarpu jei skaidant user/nice/system/idle galima naudotis daugybe budu. Pasiimsim primityviausia, irtoli grazu ne efektyviausia */ full=delta_idle+delta_user+delta_nice+delta_system; load=full-delta_idle; userl=load-delta_user; prcf=(load*1.0/full*1.0)*100; prcu=(userl*1.0/full*1.0)*100; /* analogiskai ir su nice bei system procesais - load - tai bendras, pagal ji reiketu ir kitus skaiciuot */ printf("Bendras:%d Apkrovimas=%d Procentais:%g User:%g\n",full,load,prcf,prcu); prev_user=user; prev_nice=nice; prev_system=system; prev_idle=idle; } void gethdd(void) { struct statfs sf; /* if(argc > 1) { statfs(argv[1], &sf); } else { */ statfs("/", &sf); /* } */ /* f_bavail == paprastiems useriams, f_bfree == root useriui */ printf("%d MB is viso; laisvu: %d MB(%d MB root vartotojui)\n", (sf.f_blocks * sf.f_bsize)/1048576, (sf.f_bavail * sf.f_bsize)/1048576, (sf.f_bfree * sf.f_bsize)/1048576 ); }