|
|
1.1 ! root 1: /* time command */ ! 2: ! 3: #include <stdio.h> ! 4: #include <signal.h> ! 5: #include <sys/types.h> ! 6: #include <sys/times.h> ! 7: #include <sys/vtimes.h> ! 8: ! 9: extern int errno; ! 10: extern char *sys_errlist[]; ! 11: int vflag = 0; ! 12: char output[BUFSIZ]; ! 13: ! 14: #define U 0001 ! 15: #define S 0002 ! 16: #define R 0004 ! 17: #define T 0010 ! 18: #define D 0020 ! 19: #define M 0040 ! 20: #define F 0100 ! 21: #define I 0200 ! 22: #define O 0400 ! 23: #define ALL 0777 ! 24: ! 25: #define t(x) (flags&x) ! 26: ! 27: int flags = U|S|R; ! 28: char names[] = "usrtdmfio"; ! 29: ! 30: main(argc, argv) ! 31: char **argv; ! 32: { ! 33: double x; ! 34: int status; ! 35: struct vtimes vt; ! 36: time_t before, after; ! 37: char buf[BUFSIZ]; ! 38: register char *p; ! 39: register i, pid; ! 40: ! 41: setbuf(stderr, buf); ! 42: if(argc>1 && argv[1][0]=='-') { ! 43: flags = 0; ! 44: for(flags=0; argc>1 && argv[1][0]=='-'; --argc, argv++) ! 45: for(p=argv[1]+1; *p; p++) { ! 46: if(*p == 'v') ! 47: flags = ALL; ! 48: else if((i=index(*p, names)) < 0) ! 49: fprintf(stderr, "time: bad flag %c\n", *p); ! 50: else ! 51: flags |= 1<<i; ! 52: } ! 53: } ! 54: if(argc <= 1) { ! 55: fprintf(stderr, "usage: time [-usrtdmfio] [-v] cmd\n"); ! 56: exit(1); ! 57: } ! 58: time(&before); ! 59: pid = fork(); ! 60: if(pid == -1) { ! 61: perror("Try again"); ! 62: exit(1); ! 63: } ! 64: if(pid == 0) { ! 65: execvp(argv[1], &argv[1]); ! 66: fprintf(stderr, "%s: %s\n", argv[1], sys_errlist[errno]); ! 67: exit(1); ! 68: } ! 69: signal(SIGINT, SIG_IGN); ! 70: signal(SIGQUIT, SIG_IGN); ! 71: while(wait(&status) != pid) ! 72: ; ! 73: time(&after); ! 74: vtimes((struct vtimes *)0, &vt); ! 75: if((status&0377) != 0) ! 76: fprintf(stderr,"Command terminated abnormally.\n"); ! 77: x = vt.vm_utime+vt.vm_stime; ! 78: if(t(U)) ! 79: add("%.1fu", (double)vt.vm_utime/60); ! 80: if(t(S)) ! 81: add("%.1fs", (double)vt.vm_stime/60); ! 82: if(t(R)) ! 83: add("%dr", after-before); ! 84: if(t(T)) ! 85: add("%.0ft", vt.vm_ixrss/2/x); ! 86: if(t(D)) ! 87: add("%.0fd", vt.vm_idsrss/2/x); ! 88: if(t(M)) ! 89: add("%dm", vt.vm_maxrss/2); ! 90: if(t(F)) ! 91: add("%df", vt.vm_majflt); ! 92: if(t(I)) ! 93: add("%di", vt.vm_inblk); ! 94: if(t(O)) ! 95: add("%do", vt.vm_oublk); ! 96: add("\t"); ! 97: for(i=1; i<argc; i++) { ! 98: add("%s", argv[i]); ! 99: if(i > 4) { ! 100: add("..."); ! 101: break; ! 102: } ! 103: } ! 104: fprintf(stderr, "%s\n", output); ! 105: return (status&0377)? -1 : (status>>8)&0377; ! 106: } ! 107: add(a, b, c, d, e) ! 108: char *a; ! 109: int b, c, d, e; ! 110: { ! 111: static beenhere=0; ! 112: if(beenhere) ! 113: strcat(output, " "); ! 114: sprintf(output+strlen(output), a, b, c, d, e); ! 115: beenhere++; ! 116: } ! 117: index(c, s) ! 118: register char *s; ! 119: { ! 120: register i; ! 121: for(i=0; *s; i++, s++) ! 122: if(*s == c) ! 123: return i; ! 124: return -1; ! 125: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.