|
|
1.1 ! root 1: #ifndef lint ! 2: static char *sccsid = "@(#)time.c 4.7 (Berkeley) 11/17/87"; ! 3: #endif ! 4: ! 5: /* ! 6: * time ! 7: */ ! 8: #include <stdio.h> ! 9: #include <signal.h> ! 10: #include <sys/types.h> ! 11: #include <sys/time.h> ! 12: #include <sys/resource.h> ! 13: ! 14: main(argc, argv) ! 15: int argc; ! 16: char **argv; ! 17: { ! 18: int status, lflag = 0; ! 19: register int p; ! 20: struct timeval before, after; ! 21: struct rusage ru; ! 22: ! 23: if (argc<=1) ! 24: exit(0); ! 25: if (strcmp(argv[1], "-l") == 0) { ! 26: lflag++; ! 27: argc--; ! 28: argv++; ! 29: } ! 30: gettimeofday(&before, (struct timezone *)NULL); ! 31: p = fork(); ! 32: if (p < 0) { ! 33: perror("time"); ! 34: exit(1); ! 35: } ! 36: if (p == 0) { ! 37: execvp(argv[1], &argv[1]); ! 38: perror(argv[1]); ! 39: exit(1); ! 40: } ! 41: (void)signal(SIGINT, SIG_IGN); ! 42: (void)signal(SIGQUIT, SIG_IGN); ! 43: while (wait3(&status, 0, &ru) != p) ! 44: ; ! 45: gettimeofday(&after, (struct timezone *)NULL); ! 46: if ((status&0377) != 0) ! 47: fprintf(stderr, "Command terminated abnormally.\n"); ! 48: after.tv_sec -= before.tv_sec; ! 49: after.tv_usec -= before.tv_usec; ! 50: if (after.tv_usec < 0) ! 51: after.tv_sec--, after.tv_usec += 1000000; ! 52: printt("real", &after); ! 53: printt("user", &ru.ru_utime); ! 54: printt("sys ", &ru.ru_stime); ! 55: fprintf(stderr, "\n"); ! 56: if (lflag) { ! 57: int hz = 100; /* XXX */ ! 58: long ticks; ! 59: ! 60: ticks = hz * (ru.ru_utime.tv_sec + ru.ru_stime.tv_sec) + ! 61: hz * (ru.ru_utime.tv_usec + ru.ru_stime.tv_usec) / 1000000; ! 62: fprintf(stderr, "%10ld %s\n", ! 63: ru.ru_maxrss, "maximum resident set size"); ! 64: fprintf(stderr, "%10ld %s\n", ! 65: ru.ru_ixrss / ticks, "average shared memory size"); ! 66: fprintf(stderr, "%10ld %s\n", ! 67: ru.ru_idrss / ticks, "average unshared data size"); ! 68: fprintf(stderr, "%10ld %s\n", ! 69: ru.ru_isrss / ticks, "average unshared stack size"); ! 70: fprintf(stderr, "%10ld %s\n", ! 71: ru.ru_minflt, "page reclaims"); ! 72: fprintf(stderr, "%10ld %s\n", ! 73: ru.ru_majflt, "page faults"); ! 74: fprintf(stderr, "%10ld %s\n", ! 75: ru.ru_nswap, "swaps"); ! 76: fprintf(stderr, "%10ld %s\n", ! 77: ru.ru_inblock, "block input operations"); ! 78: fprintf(stderr, "%10ld %s\n", ! 79: ru.ru_oublock, "block output operations"); ! 80: fprintf(stderr, "%10ld %s\n", ! 81: ru.ru_msgsnd, "messages sent"); ! 82: fprintf(stderr, "%10ld %s\n", ! 83: ru.ru_msgrcv, "messages received"); ! 84: fprintf(stderr, "%10ld %s\n", ! 85: ru.ru_nsignals, "signals received"); ! 86: fprintf(stderr, "%10ld %s\n", ! 87: ru.ru_nvcsw, "voluntary context switches"); ! 88: fprintf(stderr, "%10ld %s\n", ! 89: ru.ru_nivcsw, "involuntary context switches"); ! 90: } ! 91: exit (status>>8); ! 92: } ! 93: ! 94: printt(s, tv) ! 95: char *s; ! 96: struct timeval *tv; ! 97: { ! 98: ! 99: fprintf(stderr, "%9ld.%02ld %s ", tv->tv_sec, tv->tv_usec/10000, s); ! 100: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.