00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #define FSHIFT 16
00044 #define FIXED_1 (1<<FSHIFT)
00045 #define LOAD_INT(x) ((x) >> FSHIFT)
00046 #define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1-1)) * 100)
00047
00048 #ifdef linux
00049 #include <sys/sysinfo.h>
00050 #endif
00051 #include <errno.h>
00052 #include <iostream>
00053 #include <iomanip>
00054
00055 #include <stdio.h>
00056 #include <unistd.h>
00057 #include <time.h>
00058 #ifdef linux
00059 #include <linux/limits.h>
00060 #endif
00061 #include <sys/times.h>
00062 #include <sstream>
00063 #include "procUtils.h"
00064
00065 namespace evf{
00066 namespace utils{
00067
00068
00069
00070
00071 typedef long long int num;
00072
00073 num pid;
00074 char tcomm[FILENAME_MAX];
00075 char state;
00076
00077 num ppid;
00078 num pgid;
00079 num sid;
00080 num tty_nr;
00081 num tty_pgrp;
00082
00083 num flags;
00084 num min_flt;
00085 num cmin_flt;
00086 num maj_flt;
00087 num cmaj_flt;
00088 num utime;
00089 num stimev;
00090
00091 num cutime;
00092 num cstime;
00093 num priority;
00094 num nicev;
00095 num num_threads;
00096 num it_real_value;
00097
00098 unsigned long long start_time;
00099
00100 num vsize;
00101 num rss;
00102 num rsslim;
00103 num start_code;
00104 num end_code;
00105 num start_stack;
00106 num esp;
00107 num eip;
00108
00109 num pending;
00110 num blocked;
00111 num sigign;
00112 num sigcatch;
00113 num wchan;
00114 num zero1;
00115 num zero2;
00116 num exit_signal;
00117 num cpu;
00118 num rt_priority;
00119 num policy;
00120
00121 long tickspersec;
00122 char obuf[4096];
00123 FILE *input;
00124
00125 void readone(num *x) { fscanf(input, "%lld ", x); }
00126 void readunsigned(unsigned long long *x) { fscanf(input, "%llu ", x); }
00127 void readstr(char *x) { fscanf(input, "%s ", x);}
00128 void readchar(char *x) { fscanf(input, "%c ", x);}
00129
00130 void printone(const char *name, num x) { sprintf(obuf,"%20s: %lld\n", name, x);}
00131 void printonex(const char *name, num x) { sprintf(obuf,"%20s: %016llx\n", name, x);}
00132 void printunsigned(const char *name, unsigned long long x) { sprintf(obuf,"%20s: %llu\n", name, x);}
00133 void printchar(const char *name, char x) { sprintf(obuf,"%20s: %c\n", name, x);}
00134 void printstr(const char *name, char *x) { sprintf(obuf,"%20s: %s\n", name, x);}
00135 void printtime(const char *name, num x) { sprintf(obuf,"%20s: %f\n", name, (((double)x) / tickspersec));}
00136
00137 int gettimesinceboot() {
00138 FILE *procuptime;
00139 int sec, ssec;
00140
00141 procuptime = fopen("/proc/uptime", "r");
00142 fscanf(procuptime, "%d.%ds", &sec, &ssec);
00143 fclose(procuptime);
00144 return (sec*tickspersec)+ssec;
00145 }
00146
00147 void printtimediff(const char *name, num x) {
00148 int sinceboot = gettimesinceboot();
00149 int running = sinceboot - x;
00150 time_t rt = time(NULL) - (running / tickspersec);
00151 char buf[1024];
00152
00153 strftime(buf, sizeof(buf), "%m.%d %H:%M", localtime(&rt));
00154 sprintf(obuf,"%20s: %s (%lu.%lus)\n", name, buf, running / tickspersec, running % tickspersec);
00155 }
00156
00157 void procStat(std::ostringstream *out) {
00158 tickspersec = sysconf(_SC_CLK_TCK);
00159 input = NULL;
00160
00161 std::ostringstream ost;
00162 ost << "/proc/" << getpid() << "/stat";
00163 input = fopen(ost.str().c_str(), "r");
00164
00165
00166 readone(&pid);
00167 readstr(tcomm);
00168 readchar(&state);
00169 readone(&ppid);
00170 readone(&pgid);
00171 readone(&sid);
00172 readone(&tty_nr);
00173 readone(&tty_pgrp);
00174 readone(&flags);
00175 readone(&min_flt);
00176 readone(&cmin_flt);
00177 readone(&maj_flt);
00178 readone(&cmaj_flt);
00179 readone(&utime);
00180 readone(&stimev);
00181 readone(&cutime);
00182 readone(&cstime);
00183 readone(&priority);
00184 readone(&nicev);
00185 readone(&num_threads);
00186 readone(&it_real_value);
00187 readunsigned(&start_time);
00188 readone(&vsize);
00189 readone(&rss);
00190 readone(&rsslim);
00191 readone(&start_code);
00192 readone(&end_code);
00193 readone(&start_stack);
00194 readone(&esp);
00195 readone(&eip);
00196 readone(&pending);
00197 readone(&blocked);
00198 readone(&sigign);
00199 readone(&sigcatch);
00200 readone(&wchan);
00201 readone(&zero1);
00202 readone(&zero2);
00203 readone(&exit_signal);
00204 readone(&cpu);
00205 readone(&rt_priority);
00206 readone(&policy);
00207
00208 {
00209 printone("pid", pid); *out << obuf;
00210 printstr("tcomm", tcomm); *out << obuf;
00211 printchar("state", state); *out << obuf;
00212 printone("ppid", ppid); *out << obuf;
00213 printone("pgid", pgid); *out << obuf;
00214 printone("sid", sid); *out << obuf;
00215 printone("tty_nr", tty_nr); *out << obuf;
00216 printone("tty_pgrp", tty_pgrp); *out << obuf;
00217 printone("flags", flags); *out << obuf;
00218 printone("min_flt", min_flt); *out << obuf;
00219 printone("cmin_flt", cmin_flt); *out << obuf;
00220 printone("maj_flt", maj_flt); *out << obuf;
00221 printone("cmaj_flt", cmaj_flt); *out << obuf;
00222 printtime("utime", utime); *out << obuf;
00223 printtime("stime", stimev); *out << obuf;
00224 printtime("cutime", cutime); *out << obuf;
00225 printtime("cstime", cstime); *out << obuf;
00226 printone("priority", priority); *out << obuf;
00227 printone("nice", nicev); *out << obuf;
00228 printone("num_threads", num_threads); *out << obuf;
00229 printtime("it_real_value", it_real_value); *out << obuf;
00230 printtimediff("start_time", start_time); *out << obuf;
00231 printone("vsize", vsize); *out << obuf;
00232 printone("rss", rss); *out << obuf;
00233 printone("rsslim", rsslim); *out << obuf;
00234 printone("start_code", start_code); *out << obuf;
00235 printone("end_code", end_code); *out << obuf;
00236 printone("start_stack", start_stack); *out << obuf;
00237 printone("esp", esp); *out << obuf;
00238 printone("eip", eip); *out << obuf;
00239 printonex("pending", pending); *out << obuf;
00240 printonex("blocked", blocked); *out << obuf;
00241 printonex("sigign", sigign); *out << obuf;
00242 printonex("sigcatch", sigcatch); *out << obuf;
00243 printone("wchan", wchan); *out << obuf;
00244 printone("zero1", zero1); *out << obuf;
00245 printone("zero2", zero2); *out << obuf;
00246 printonex("exit_signal", exit_signal); *out << obuf;
00247 printone("cpu", cpu); *out << obuf;
00248 printone("rt_priority", rt_priority); *out << obuf;
00249 printone("policy", policy); *out << obuf;
00250 }
00251 fclose(input);
00252 }
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290 void uptime(std::ostringstream *out)
00291 {
00292 #ifdef linux
00293 int updays, uphours, upminutes;
00294 struct sysinfo info;
00295 struct tm *current_time;
00296 time_t current_secs;
00297
00298 time(¤t_secs);
00299 current_time = localtime(¤t_secs);
00300
00301 sysinfo(&info);
00302
00303 *out << std::setw(2)
00304 << (current_time->tm_hour%12 ? current_time->tm_hour%12 : 12)
00305 << ":"
00306 << current_time->tm_min
00307 << (current_time->tm_hour > 11 ? " pm, " : " am, ")
00308 << " up ";
00309 updays = (int) info.uptime / (60*60*24);
00310 if (updays)
00311 *out << updays << " day" << ((updays != 1) ? "s " : " ");
00312 upminutes = (int) info.uptime / 60;
00313 uphours = (upminutes / 60) % 24;
00314 upminutes %= 60;
00315 if(uphours)
00316 *out << std::setw(2) << uphours << ":" << upminutes;
00317 else
00318 *out << upminutes << " minutes ";
00319
00320 *out << " - load average "
00321 << LOAD_INT(info.loads[0]) << " "
00322 << LOAD_FRAC(info.loads[0]) << " "
00323 << LOAD_INT(info.loads[1]) << " "
00324 << LOAD_FRAC(info.loads[1]) << " "
00325 << LOAD_INT(info.loads[2]) << " "
00326 << LOAD_FRAC(info.loads[2]) << " ";
00327 *out << " used memory " << std::setw(3)
00328 << (float(info.totalram-info.freeram)/float(info.totalram))*100 << "%";
00329 #else
00330
00331
00332 *out << "Unable to retrieve uptime information on this platform.";
00333 #endif
00334 }
00335 void mDiv(std::ostringstream *out, std::string name){
00336 *out << "<div id=\"" << name << "\">";
00337 }
00338 void cDiv(std::ostringstream *out){
00339 *out << "</div>";
00340 }
00341 void mDiv(std::ostringstream *out, std::string name, std::string value){
00342 mDiv(out,name);
00343 *out << value;
00344 cDiv(out);
00345 }
00346 void mDiv(std::ostringstream *out, std::string name, unsigned int value){
00347 mDiv(out,name);
00348 *out << value;
00349 cDiv(out);
00350 }
00351 }
00352 }