#include #include #include #include #include #include #include int main(int argc, char * argv[]) { int rc; int pid; int status; struct rusage ru; if(argc < 2) { errx(1, "Usage: beancounter PROGRAM"); } pid = fork(); if(pid == 0) { rc = execve(argv[1], NULL, NULL); if(rc == -1) warn("fork() failed"); } rc = wait4(pid, &status, 0, &ru); if(rc == -1) warn("wait4() failed"); #if 0 struct rusage { struct timeval ru_utime; /* user time used */ struct timeval ru_stime; /* system time used */ long ru_maxrss; /* maximum resident set size */ long ru_ixrss; /* integral shared memory size */ long ru_idrss; /* integral unshared data size */ long ru_isrss; /* integral unshared stack size */ long ru_minflt; /* page reclaims */ long ru_majflt; /* page faults */ long ru_nswap; /* swaps */ long ru_inblock; /* block input operations */ long ru_oublock; /* block output operations */ long ru_msgsnd; /* messages sent */ long ru_msgrcv; /* messages received */ long ru_nsignals; /* signals received */ long ru_nvcsw; /* voluntary context switches */ long ru_nivcsw; /* involuntary context switches */ }; #endif printf("User time: %li.%li sec\n", ru.ru_utime.tv_sec, ru.ru_utime.tv_usec); printf("System time: %li.%li sec\n", ru.ru_stime.tv_sec, ru.ru_stime.tv_usec); printf("Maximum resident set size: %liKB\n", ru.ru_maxrss); printf("Integral shared memory size: %li KB/s\n", ru.ru_ixrss); printf("Integral unshared data size: %li KB/s\n", ru.ru_idrss); printf("Integral unshared stack size: %li KB/s\n", ru.ru_isrss); printf("Page reclaims (from cache): %li\n", ru.ru_minflt); printf("Page faults (requiring device I/O): %li\n", ru.ru_majflt); printf("Complete swaps to disk: %li\n", ru.ru_nswap); printf("Blocking noncached input operations: %li\n", ru.ru_inblock); printf("Blocking noncached output operations: %li\n", ru.ru_oublock); printf("SysV IPC Messages sent: %li\n", ru.ru_msgsnd); printf("SysV IPC Messages received: %li\n", ru.ru_msgrcv); printf("Signals received; %li\n", ru.ru_nsignals); printf("Voluntary context switches (timeslices not used up): %li\n", ru.ru_nvcsw); printf("Involuntary context switches (timeslices used up): %li\n", ru.ru_nivcsw); return 0; }