135476Sbostic /* 235476Sbostic * Copyright (c) 1987, 1988 The Regents of the University of California. 335476Sbostic * All rights reserved. 435476Sbostic * 5*42770Sbostic * %sccs.include.redist.c% 635476Sbostic */ 735476Sbostic 812900Ssam #ifndef lint 935476Sbostic char copyright[] = 1035476Sbostic "@(#) Copyright (c) 1987, 1988 The Regents of the University of California.\n\ 1135476Sbostic All rights reserved.\n"; 1235476Sbostic #endif /* not lint */ 131127Sbill 1435476Sbostic #ifndef lint 15*42770Sbostic static char sccsid[] = "@(#)time.c 4.9 (Berkeley) 06/01/90"; 1635476Sbostic #endif /* not lint */ 1735476Sbostic 181127Sbill #include <sys/types.h> 1913594Swnj #include <sys/time.h> 2013594Swnj #include <sys/resource.h> 2135476Sbostic #include <sys/signal.h> 2235476Sbostic #include <stdio.h> 231127Sbill 241127Sbill main(argc, argv) 259228Ssam int argc; 269228Ssam char **argv; 271127Sbill { 2835476Sbostic extern int optind; 2935476Sbostic register int pid; 3035476Sbostic int ch, status, lflag; 319228Ssam struct timeval before, after; 329228Ssam struct rusage ru; 331127Sbill 3435476Sbostic lflag = 0; 3535476Sbostic while ((ch = getopt(argc, argv, "l")) != EOF) 3635476Sbostic switch((char)ch) { 3735476Sbostic case 'l': 3835476Sbostic lflag = 1; 3935476Sbostic break; 4035476Sbostic case '?': 4135476Sbostic default: 4235476Sbostic fprintf(stderr, "usage: time [-l] command.\n"); 4335476Sbostic exit(1); 4435476Sbostic } 4535476Sbostic 4635476Sbostic if (!(argc -= optind)) 471127Sbill exit(0); 4835476Sbostic argv += optind; 4935476Sbostic 5032629Sbostic gettimeofday(&before, (struct timezone *)NULL); 5135476Sbostic switch(pid = vfork()) { 5235476Sbostic case -1: /* error */ 539228Ssam perror("time"); 541127Sbill exit(1); 5535476Sbostic /* NOTREACHED */ 5635476Sbostic case 0: /* child */ 5735476Sbostic execvp(*argv, argv); 5835476Sbostic perror(*argv); 5935476Sbostic _exit(1); 6035476Sbostic /* NOTREACHED */ 611127Sbill } 6235476Sbostic /* parent */ 6332629Sbostic (void)signal(SIGINT, SIG_IGN); 6432629Sbostic (void)signal(SIGQUIT, SIG_IGN); 6535476Sbostic while (wait3(&status, 0, &ru) != pid); /* XXX use waitpid */ 6632629Sbostic gettimeofday(&after, (struct timezone *)NULL); 6735476Sbostic if (status&0377) 689228Ssam fprintf(stderr, "Command terminated abnormally.\n"); 699228Ssam after.tv_sec -= before.tv_sec; 709228Ssam after.tv_usec -= before.tv_usec; 719228Ssam if (after.tv_usec < 0) 729228Ssam after.tv_sec--, after.tv_usec += 1000000; 7335476Sbostic fprintf(stderr, "%9ld.%02ld real ", after.tv_sec, after.tv_usec/10000); 7435476Sbostic fprintf(stderr, "%9ld.%02ld user ", 7535476Sbostic ru.ru_utime.tv_sec, ru.ru_utime.tv_usec/10000); 7635476Sbostic fprintf(stderr, "%9ld.%02ld sys\n", 7735476Sbostic ru.ru_stime.tv_sec, ru.ru_stime.tv_usec/10000); 7832571Skarels if (lflag) { 7932571Skarels int hz = 100; /* XXX */ 8032571Skarels long ticks; 8132571Skarels 8232571Skarels ticks = hz * (ru.ru_utime.tv_sec + ru.ru_stime.tv_sec) + 8332571Skarels hz * (ru.ru_utime.tv_usec + ru.ru_stime.tv_usec) / 1000000; 8432629Sbostic fprintf(stderr, "%10ld %s\n", 8532571Skarels ru.ru_maxrss, "maximum resident set size"); 8632629Sbostic fprintf(stderr, "%10ld %s\n", 8732571Skarels ru.ru_ixrss / ticks, "average shared memory size"); 8832629Sbostic fprintf(stderr, "%10ld %s\n", 8932571Skarels ru.ru_idrss / ticks, "average unshared data size"); 9032629Sbostic fprintf(stderr, "%10ld %s\n", 9132571Skarels ru.ru_isrss / ticks, "average unshared stack size"); 9232629Sbostic fprintf(stderr, "%10ld %s\n", 9332571Skarels ru.ru_minflt, "page reclaims"); 9432629Sbostic fprintf(stderr, "%10ld %s\n", 9532571Skarels ru.ru_majflt, "page faults"); 9632629Sbostic fprintf(stderr, "%10ld %s\n", 9732571Skarels ru.ru_nswap, "swaps"); 9832629Sbostic fprintf(stderr, "%10ld %s\n", 9932571Skarels ru.ru_inblock, "block input operations"); 10032629Sbostic fprintf(stderr, "%10ld %s\n", 10132571Skarels ru.ru_oublock, "block output operations"); 10232629Sbostic fprintf(stderr, "%10ld %s\n", 10332571Skarels ru.ru_msgsnd, "messages sent"); 10432629Sbostic fprintf(stderr, "%10ld %s\n", 10532571Skarels ru.ru_msgrcv, "messages received"); 10632629Sbostic fprintf(stderr, "%10ld %s\n", 10732571Skarels ru.ru_nsignals, "signals received"); 10832629Sbostic fprintf(stderr, "%10ld %s\n", 10932571Skarels ru.ru_nvcsw, "voluntary context switches"); 11032629Sbostic fprintf(stderr, "%10ld %s\n", 11132571Skarels ru.ru_nivcsw, "involuntary context switches"); 11232571Skarels } 1139228Ssam exit (status>>8); 1141127Sbill } 115