1 /* $NetBSD: time.c,v 1.18 2007/02/26 21:56:17 matt Exp $ */
4 * Copyright (c) 1987, 1988, 1993
5 * The Regents of the University of California. All rights reserved.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the University nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 #include <sys/cdefs.h>
34 __COPYRIGHT("@(#) Copyright (c) 1987, 1988, 1993\
35 The Regents of the University of California. All rights reserved.");
40 static char sccsid
[] = "@(#)time.c 8.1 (Berkeley) 6/6/93";
42 __RCSID("$NetBSD: time.c,v 1.18 2007/02/26 21:56:17 matt Exp $");
45 #include <sys/types.h>
47 #include <sys/resource.h>
59 int main(int, char **);
60 static void usage(void);
61 static void prl(long, const char *);
62 static void prtv(const char *, const char *, const struct timeval
*,
66 main(int argc
, char ** volatile argv
)
70 int volatile portableflag
;
74 const struct lconv
*lconv
;
75 struct timeval before
, after
;
78 (void)setlocale(LC_ALL
, "");
80 cshflag
= lflag
= portableflag
= 0;
81 while ((ch
= getopt(argc
, argv
, "clp")) != -1) {
109 gettimeofday(&before
, (struct timezone
*)NULL
);
110 switch(pid
= vfork()) {
112 err(EXIT_FAILURE
, "Vfork failed");
115 /* LINTED will return only on failure */
117 err((errno
== ENOENT
) ? 127 : 126, "Can't exec `%s'", *argv
);
122 (void)signal(SIGINT
, SIG_IGN
);
123 (void)signal(SIGQUIT
, SIG_IGN
);
124 if ((pid
= wait4(pid
, &status
, 0, &ru
)) == -1)
125 err(EXIT_FAILURE
, "wait4 %d failed", pid
);
126 (void)gettimeofday(&after
, (struct timezone
*)NULL
);
127 if (!WIFEXITED(status
))
128 warnx("Command terminated abnormally.");
129 timersub(&after
, &before
, &after
);
131 if ((lconv
= localeconv()) == NULL
||
132 (decpt
= lconv
->decimal_point
) == NULL
)
136 static struct rusage null_ru
;
139 prusage(stderr
, &null_ru
, &ru
, &after
, &before
);
140 } else if (portableflag
) {
141 prtv("real ", decpt
, &after
, "\n");
142 prtv("user ", decpt
, &ru
.ru_utime
, "\n");
143 prtv("sys ", decpt
, &ru
.ru_stime
, "\n");
145 prtv("", decpt
, &after
, " real ");
146 prtv("", decpt
, &ru
.ru_utime
, " user ");
147 prtv("", decpt
, &ru
.ru_stime
, " sys\n");
151 int hz
= (int)sysconf(_SC_CLK_TCK
);
152 unsigned long long ticks
;
153 #define SCALE(x) (long)(ticks ? x / ticks : 0)
155 ticks
= hz
* (ru
.ru_utime
.tv_sec
+ ru
.ru_stime
.tv_sec
) +
156 hz
* (ru
.ru_utime
.tv_usec
+ ru
.ru_stime
.tv_usec
) / 1000000;
157 prl(ru
.ru_maxrss
, "maximum resident set size");
158 prl(SCALE(ru
.ru_ixrss
), "average shared memory size");
159 prl(SCALE(ru
.ru_idrss
), "average unshared data size");
160 prl(SCALE(ru
.ru_isrss
), "average unshared stack size");
161 prl(ru
.ru_minflt
, "page reclaims");
162 prl(ru
.ru_majflt
, "page faults");
163 prl(ru
.ru_nswap
, "swaps");
164 prl(ru
.ru_inblock
, "block input operations");
165 prl(ru
.ru_oublock
, "block output operations");
166 prl(ru
.ru_msgsnd
, "messages sent");
167 prl(ru
.ru_msgrcv
, "messages received");
168 prl(ru
.ru_nsignals
, "signals received");
169 prl(ru
.ru_nvcsw
, "voluntary context switches");
170 prl(ru
.ru_nivcsw
, "involuntary context switches");
173 return (WIFEXITED(status
) ? WEXITSTATUS(status
) : EXIT_FAILURE
);
180 (void)fprintf(stderr
, "usage: %s [-clp] utility [argument ...]\n",
186 prl(long val
, const char *expn
)
189 (void)fprintf(stderr
, "%10ld %s\n", val
, expn
);
193 prtv(const char *pre
, const char *decpt
, const struct timeval
*tv
,
197 (void)fprintf(stderr
, "%s%9ld%s%02ld%s", pre
, (long)tv
->tv_sec
, decpt
,
198 (long)tv
->tv_usec
/ 10000, post
);