112900Ssam #ifndef lint 2*32571Skarels static char *sccsid = "@(#)time.c 4.6 (Berkeley) 10/31/87"; 312900Ssam #endif 41127Sbill 59228Ssam /* 69228Ssam * time 79228Ssam */ 81127Sbill #include <stdio.h> 91127Sbill #include <signal.h> 101127Sbill #include <sys/types.h> 1113594Swnj #include <sys/time.h> 1213594Swnj #include <sys/resource.h> 131127Sbill 141127Sbill main(argc, argv) 159228Ssam int argc; 169228Ssam char **argv; 171127Sbill { 18*32571Skarels int status, lflag = 0; 199228Ssam register int p; 209228Ssam struct timeval before, after; 219228Ssam struct rusage ru; 221127Sbill 239228Ssam if (argc<=1) 241127Sbill exit(0); 25*32571Skarels if (strcmp(argv[1], "-l") == 0) { 26*32571Skarels lflag++; 27*32571Skarels argc--; 28*32571Skarels argv++; 29*32571Skarels } 309228Ssam gettimeofday(&before, 0); 311127Sbill p = fork(); 329228Ssam if (p < 0) { 339228Ssam perror("time"); 341127Sbill exit(1); 351127Sbill } 369228Ssam if (p == 0) { 371127Sbill execvp(argv[1], &argv[1]); 389228Ssam perror(argv[1]); 391127Sbill exit(1); 401127Sbill } 411127Sbill signal(SIGINT, SIG_IGN); 421127Sbill signal(SIGQUIT, SIG_IGN); 439228Ssam while (wait3(&status, 0, &ru) != p) 449228Ssam ; 459228Ssam gettimeofday(&after, 0); 469228Ssam if ((status&0377) != 0) 479228Ssam fprintf(stderr, "Command terminated abnormally.\n"); 489228Ssam after.tv_sec -= before.tv_sec; 499228Ssam after.tv_usec -= before.tv_usec; 509228Ssam if (after.tv_usec < 0) 519228Ssam after.tv_sec--, after.tv_usec += 1000000; 529228Ssam printt("real", &after); 539228Ssam printt("user", &ru.ru_utime); 549228Ssam printt("sys ", &ru.ru_stime); 551370Sbill fprintf(stderr, "\n"); 56*32571Skarels if (lflag) { 57*32571Skarels int hz = 100; /* XXX */ 58*32571Skarels long ticks; 59*32571Skarels 60*32571Skarels ticks = hz * (ru.ru_utime.tv_sec + ru.ru_stime.tv_sec) + 61*32571Skarels hz * (ru.ru_utime.tv_usec + ru.ru_stime.tv_usec) / 1000000; 62*32571Skarels fprintf(stderr, "%10D %s\n", 63*32571Skarels ru.ru_maxrss, "maximum resident set size"); 64*32571Skarels fprintf(stderr, "%10D %s\n", 65*32571Skarels ru.ru_ixrss / ticks, "average shared memory size"); 66*32571Skarels fprintf(stderr, "%10D %s\n", 67*32571Skarels ru.ru_idrss / ticks, "average unshared data size"); 68*32571Skarels fprintf(stderr, "%10D %s\n", 69*32571Skarels ru.ru_isrss / ticks, "average unshared stack size"); 70*32571Skarels fprintf(stderr, "%10D %s\n", 71*32571Skarels ru.ru_minflt, "page reclaims"); 72*32571Skarels fprintf(stderr, "%10D %s\n", 73*32571Skarels ru.ru_majflt, "page faults"); 74*32571Skarels fprintf(stderr, "%10D %s\n", 75*32571Skarels ru.ru_nswap, "swaps"); 76*32571Skarels fprintf(stderr, "%10D %s\n", 77*32571Skarels ru.ru_inblock, "block input operations"); 78*32571Skarels fprintf(stderr, "%10D %s\n", 79*32571Skarels ru.ru_oublock, "block output operations"); 80*32571Skarels fprintf(stderr, "%10D %s\n", 81*32571Skarels ru.ru_msgsnd, "messages sent"); 82*32571Skarels fprintf(stderr, "%10D %s\n", 83*32571Skarels ru.ru_msgrcv, "messages received"); 84*32571Skarels fprintf(stderr, "%10D %s\n", 85*32571Skarels ru.ru_nsignals, "signals received"); 86*32571Skarels fprintf(stderr, "%10D %s\n", 87*32571Skarels ru.ru_nvcsw, "voluntary context switches"); 88*32571Skarels fprintf(stderr, "%10D %s\n", 89*32571Skarels ru.ru_nivcsw, "involuntary context switches"); 90*32571Skarels } 919228Ssam exit (status>>8); 921127Sbill } 931127Sbill 949228Ssam printt(s, tv) 959228Ssam char *s; 969228Ssam struct timeval *tv; 971127Sbill { 981127Sbill 99*32571Skarels fprintf(stderr, "%9d.%02d %s ", tv->tv_sec, tv->tv_usec/10000, s); 1001127Sbill } 101