static void prusage(register struct rusage *r0, register struct rusage *r1, struct timeval *e, struct timeval *b, char *outp) { struct timeval tdiff; register time_t t; register char *cp; register int i; int ms; t = (r1->ru_utime.tv_sec-r0->ru_utime.tv_sec)*100+ (r1->ru_utime.tv_usec-r0->ru_utime.tv_usec)/10000+ (r1->ru_stime.tv_sec-r0->ru_stime.tv_sec)*100+ (r1->ru_stime.tv_usec-r0->ru_stime.tv_usec)/10000; ms = (e->tv_sec-b->tv_sec)*100 + (e->tv_usec-b->tv_usec)/10000; #define END(x) {while(*x) x++;} cp = "%Uuser %Ssys %Ereal %P %Xi+%Dd %Mmaxrss %F+%Rpf %Ccsw"; for (; *cp; cp++) { if (*cp != '%') *outp++ = *cp; else if (cp[1]) switch(*++cp) { case 'U': tvsub(&tdiff, &r1->ru_utime, &r0->ru_utime); sprintf(outp, "%ld.%01ld", tdiff.tv_sec, tdiff.tv_usec/100000); END(outp); break; case 'S': tvsub(&tdiff, &r1->ru_stime, &r0->ru_stime); sprintf(outp, "%ld.%01ld", tdiff.tv_sec, tdiff.tv_usec/100000); END(outp); break; case 'E': psecs(ms / 100, outp); END(outp); break; case 'P': sprintf(outp, "%d%%", (int) (t*100 / ((ms ? ms : 1)))); END(outp); break; case 'W': i = r1->ru_nswap - r0->ru_nswap; sprintf(outp, "%d", i); END(outp); break; case 'X': sprintf(outp, "%ld", t == 0 ? 0 : (r1->ru_ixrss-r0->ru_ixrss)/t); END(outp); break; case 'D': sprintf(outp, "%ld", t == 0 ? 0 : (r1->ru_idrss+r1->ru_isrss-(r0->ru_idrss+r0->ru_isrss))/t); END(outp); break; case 'K': sprintf(outp, "%ld", t == 0 ? 0 : ((r1->ru_ixrss+r1->ru_isrss+r1->ru_idrss) - (r0->ru_ixrss+r0->ru_idrss+r0->ru_isrss))/t); END(outp); break; case 'M': sprintf(outp, "%ld", r1->ru_maxrss/2); END(outp); break; case 'F': sprintf(outp, "%ld", r1->ru_majflt-r0->ru_majflt); END(outp); break; case 'R': sprintf(outp, "%ld", r1->ru_minflt-r0->ru_minflt); END(outp); break; case 'I': sprintf(outp, "%ld", r1->ru_inblock-r0->ru_inblock); END(outp); break; case 'O': sprintf(outp, "%ld", r1->ru_oublock-r0->ru_oublock); END(outp); break; case 'C': sprintf(outp, "%ld+%ld", r1->ru_nvcsw-r0->ru_nvcsw, r1->ru_nivcsw-r0->ru_nivcsw ); END(outp); break; } } *outp = '\0'; }
static void prusage (register struct rusage *r0, struct rusage *r1, struct timeval *b, struct timeval *e, char *outp) { struct timeval tdiff; register time_t t; register char *cp; register int i; int ms; t = (r1->ru_utime.tv_sec - r0->ru_utime.tv_sec) * 1000 + (r1->ru_utime.tv_usec - r0->ru_utime.tv_usec) / 100000 + (r1->ru_stime.tv_sec - r0->ru_stime.tv_sec) * 1000 + (r1->ru_stime.tv_usec - r0->ru_stime.tv_usec) / 100000; ms = -((e->tv_sec - b->tv_sec) * 1000 + (e->tv_usec - b->tv_usec) / 1000);/* in milliseconds */ #define END(x) {while(*x) x++;} #if defined(SYSV) cp = "%Uuser %Ssys %Ereal %P"; #else #if defined(sgi) /* IRIX 3.3 will show 0 for %M,%F,%R,%C */ cp = "%Uuser %Ssys %Ereal %P %Mmaxrss %F+%Rpf %Ccsw"; #else cp = "%Uutime %Sstime %Edtime %P cpu occupancy"; /* cp = "%Uuser %Ssys %Ereal %P %Xi+%Dd %Mmaxrss %F+%Rpf %Ccsw";*/ #endif #endif for (; *cp; cp++) { if (*cp != '%') *outp++ = *cp; else if (cp[1]) switch (*++cp) { case 'U': tvsub (&tdiff, &r1->ru_utime, &r0->ru_utime); /* sprintf (outp, "%d.%01d", tdiff.tv_sec, tdiff.tv_usec);*/ sprintf (outp, "%f", (tdiff.tv_sec + tdiff.tv_usec/1000000.0)); END (outp); break; case 'S': tvsub (&tdiff, &r1->ru_stime, &r0->ru_stime); /* sprintf (outp, "%d.%01d", tdiff.tv_sec, tdiff.tv_usec);*/ sprintf (outp, "%f", (tdiff.tv_sec + tdiff.tv_usec/1000000.0)); END (outp); break; case 'E': psecs (ms / 1000, outp); END (outp); break; case 'P': sprintf (outp, "%f%%", (t * 100.0 / ((ms ? ms : 1)))); END (outp); break; #if !defined(SYSV) case 'W': i = r1->ru_nswap - r0->ru_nswap; sprintf (outp, "%d", i); END (outp); break; case 'X': sprintf (outp, "%d", t == 0 ? 0 : (r1->ru_ixrss - r0->ru_ixrss) / t); END (outp); break; case 'D': sprintf (outp, "%d", t == 0 ? 0 : (r1->ru_idrss + r1->ru_isrss - (r0->ru_idrss + r0->ru_isrss)) / t); END (outp); break; case 'K': sprintf (outp, "%d", t == 0 ? 0 : ((r1->ru_ixrss + r1->ru_isrss + r1->ru_idrss) - (r0->ru_ixrss + r0->ru_idrss + r0->ru_isrss)) / t); END (outp); break; case 'M': sprintf (outp, "%d", r1->ru_maxrss / 2); END (outp); break; case 'F': sprintf (outp, "%d", r1->ru_majflt - r0->ru_majflt); END (outp); break; case 'R': sprintf (outp, "%d", r1->ru_minflt - r0->ru_minflt); END (outp); break; case 'I': sprintf (outp, "%d", r1->ru_inblock - r0->ru_inblock); END (outp); break; case 'O': sprintf (outp, "%d", r1->ru_oublock - r0->ru_oublock); END (outp); break; case 'C': sprintf (outp, "%d+%d", r1->ru_nvcsw - r0->ru_nvcsw, r1->ru_nivcsw - r0->ru_nivcsw); END (outp); break; #endif /* !SYSV */ } } *outp = '\0'; }