3 #include <sys/resource.h>
10 #define eprintf(...) fprintf(stderr, __VA_ARGS__)
11 #define FARG_TIMEVAL(tv) tv.tv_sec, tv.tv_usec
12 #define FSTR_TIMEVAL "%li.%06li"
14 int main(int argc, char **argv) {
15 #define CHECK_USAGE if (argc < 2) return eprintf("invocation: rusage_precise [--machine-readable] <command> [<args...>]\n"), 1;
17 int machine_readable = 0;
18 if (!strcmp(argv[1], "--machine-readable")) machine_readable = 1, argv++, argc--;
22 if (child == -1) return perror("fork failed"), 1;
24 execvp(argv[1], argv+1);
25 return perror("execvp failed"), 1;
31 if (wait4(child, &status, 0, &ru) != child) return perror("wait4 failed"), 1;
33 if (machine_readable) {
34 eprintf(FSTR_TIMEVAL "\t" FSTR_TIMEVAL "\t%li\t%li\t%li\t%li\t%li\t%li\t%li\n",
35 FARG_TIMEVAL(ru.ru_utime), FARG_TIMEVAL(ru.ru_stime),
36 ru.ru_maxrss, ru.ru_minflt, ru.ru_majflt,
37 ru.ru_inblock, ru.ru_oublock, ru.ru_nvcsw,
40 eprintf(" user CPU (s): " FSTR_TIMEVAL "\n", FARG_TIMEVAL(ru.ru_utime));
41 eprintf(" system CPU (s): " FSTR_TIMEVAL "\n", FARG_TIMEVAL(ru.ru_stime));
42 eprintf(" max RSS size (kB): %li\n", ru.ru_maxrss);
43 eprintf(" minor faults: %li\n", ru.ru_minflt);
44 eprintf(" major faults: %li\n", ru.ru_majflt);
45 eprintf(" fs inblocks: %li\n", ru.ru_inblock);
46 eprintf(" fs outblocks: %li\n", ru.ru_oublock);
47 eprintf(" voluntary switches: %li\n", ru.ru_nvcsw);
48 eprintf("involuntary switches: %li\n", ru.ru_nivcsw);