sbase

suckless unix tools
git clone git://git.2f30.org/sbase
Log | Files | Refs | README | LICENSE

time.c (1369B)


      1 /* See LICENSE file for copyright and license details. */
      2 #include <sys/times.h>
      3 #include <sys/wait.h>
      4 
      5 #include <errno.h>
      6 #include <stdio.h>
      7 #include <unistd.h>
      8 
      9 #include "util.h"
     10 
     11 static void
     12 usage(void)
     13 {
     14 	eprintf("usage: %s [-p] cmd [arg ...]\n", argv0);
     15 }
     16 
     17 int
     18 main(int argc, char *argv[])
     19 {
     20 	pid_t pid;
     21 	struct tms tms; /* user and sys times */
     22 	clock_t r0, r1; /* real time */
     23 	long ticks;     /* per second */
     24 	int status, savederrno, ret = 0;
     25 
     26 	ARGBEGIN {
     27 	case 'p':
     28 		break;
     29 	default:
     30 		usage();
     31 	} ARGEND
     32 
     33 	if (!argc)
     34 		usage();
     35 
     36 	if ((ticks = sysconf(_SC_CLK_TCK)) <= 0)
     37 		eprintf("sysconf _SC_CLK_TCK:");
     38 
     39 	if ((r0 = times(&tms)) == (clock_t)-1)
     40 		eprintf("times:");
     41 
     42 	switch ((pid = fork())) {
     43 	case -1:
     44 		eprintf("fork:");
     45 	case 0:
     46 		execvp(argv[0], argv);
     47 		savederrno = errno;
     48 		weprintf("execvp %s:", argv[0]);
     49 		_exit(126 + (savederrno == ENOENT));
     50 	default:
     51 		break;
     52 	}
     53 	waitpid(pid, &status, 0);
     54 
     55 	if ((r1 = times(&tms)) == (clock_t)-1)
     56 		eprintf("times:");
     57 
     58 	if (WIFSIGNALED(status)) {
     59 		fprintf(stderr, "Command terminated by signal %d\n",
     60 		        WTERMSIG(status));
     61 		ret = 128 + WTERMSIG(status);
     62 	}
     63 
     64 	fprintf(stderr, "real %f\nuser %f\nsys %f\n",
     65 	        (r1 - r0)      / (double)ticks,
     66 	        tms.tms_cutime / (double)ticks,
     67 	        tms.tms_cstime / (double)ticks);
     68 
     69 	if (WIFEXITED(status))
     70 		ret = WEXITSTATUS(status);
     71 
     72 	return ret;
     73 }