time.c - sbase - suckless unix tools
 (HTM) git clone git://git.suckless.org/sbase
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) 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 }