Import NetBSD time(1)
Change-Id: I035d21a926aa82434c24a84b914bd58ac064e66a
This commit is contained in:
		
							parent
							
								
									d1e4d7ce7d
								
							
						
					
					
						commit
						b7f0178aeb
					
				@ -25,7 +25,7 @@ SUBDIR=	add_route arp at backup \
 | 
			
		||||
	slip spell sprofalyze sprofdiff srccrc \
 | 
			
		||||
	svrctl swifi synctree sysenv \
 | 
			
		||||
	tcpd tcpdp tcpstat telnet \
 | 
			
		||||
	telnetd term termcap tget time \
 | 
			
		||||
	telnetd term termcap tget \
 | 
			
		||||
	truncate udpstat umount \
 | 
			
		||||
	update version vol \
 | 
			
		||||
	writeisofs fetch \
 | 
			
		||||
 | 
			
		||||
@ -1,3 +0,0 @@
 | 
			
		||||
PROG=	time
 | 
			
		||||
 | 
			
		||||
.include <bsd.prog.mk>
 | 
			
		||||
@ -1,32 +0,0 @@
 | 
			
		||||
.TH TIME 1
 | 
			
		||||
.SH NAME
 | 
			
		||||
time \- report how long a command takes
 | 
			
		||||
.SH SYNOPSIS
 | 
			
		||||
\fBtime [-C] \fIcommand\fR
 | 
			
		||||
.br
 | 
			
		||||
.de FL
 | 
			
		||||
.TP
 | 
			
		||||
\\fB\\$1\\fR
 | 
			
		||||
\\$2
 | 
			
		||||
..
 | 
			
		||||
.de EX
 | 
			
		||||
.TP 20
 | 
			
		||||
\\fB\\$1\\fR
 | 
			
		||||
# \\$2
 | 
			
		||||
..
 | 
			
		||||
The -C option tells time to report the cpu cycle counter
 | 
			
		||||
difference.
 | 
			
		||||
.SH EXAMPLES
 | 
			
		||||
.TP 20
 | 
			
		||||
.B time a.out
 | 
			
		||||
# Report how long \fIa.out\fR takes
 | 
			
		||||
.TP 20
 | 
			
		||||
.B time ls \-l *.c
 | 
			
		||||
# Report how long \fIls\fR takes
 | 
			
		||||
.SH DESCRIPTION
 | 
			
		||||
.PP
 | 
			
		||||
The command is executed and the real time, user time, and system time (in
 | 
			
		||||
hours, minutes, and seconds) are printed.
 | 
			
		||||
Shell scripts cannot be timed.
 | 
			
		||||
.SH "SEE ALSO"
 | 
			
		||||
.BR times (2).
 | 
			
		||||
@ -1,172 +0,0 @@
 | 
			
		||||
/* time - time a command	Authors: Andy Tanenbaum & Michiel Huisjes */
 | 
			
		||||
 | 
			
		||||
#define NEW	1
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/times.h>
 | 
			
		||||
#include <limits.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
#include <signal.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <sys/wait.h>
 | 
			
		||||
#include <minix/minlib.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
/* -DNEW prints time to 0.01 sec. */
 | 
			
		||||
#ifdef NEW		
 | 
			
		||||
#define HUNDREDTHS 1
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
char **args;
 | 
			
		||||
char *name;
 | 
			
		||||
 | 
			
		||||
int digit_seen;
 | 
			
		||||
char a[] = "        . \0";
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv);
 | 
			
		||||
void print_time(clock_t t);
 | 
			
		||||
void twin(int n, char *p);
 | 
			
		||||
void execute(void);
 | 
			
		||||
 | 
			
		||||
int main(argc, argv)
 | 
			
		||||
int argc;
 | 
			
		||||
char *argv[];
 | 
			
		||||
{
 | 
			
		||||
  int cycles = 0;
 | 
			
		||||
  struct tms pre_buf, post_buf;
 | 
			
		||||
  int status, pid;
 | 
			
		||||
  struct tms dummy;
 | 
			
		||||
  int start_time, end_time;
 | 
			
		||||
  u64_t start_tsc, end_tsc, spent_tsc;
 | 
			
		||||
  clock_t real_time;
 | 
			
		||||
  int c;
 | 
			
		||||
 | 
			
		||||
  if (argc == 1) exit(0);
 | 
			
		||||
 | 
			
		||||
  while((c=getopt(argc, argv, "C")) != EOF) {
 | 
			
		||||
    switch(c) {
 | 
			
		||||
  	case 'C':
 | 
			
		||||
		cycles = 1;
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
		fprintf(stderr, "usage: time [-C] <command>\n");
 | 
			
		||||
		exit(1);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  argv += optind;
 | 
			
		||||
  argc -= optind;
 | 
			
		||||
 | 
			
		||||
  args = &argv[0];
 | 
			
		||||
  name = argv[0];
 | 
			
		||||
 | 
			
		||||
  /* Get real time at start of run. */
 | 
			
		||||
  start_time = times(&dummy);
 | 
			
		||||
  read_tsc_64(&start_tsc);
 | 
			
		||||
 | 
			
		||||
  /* Fork off child. */
 | 
			
		||||
  if ((pid = fork()) < 0) {
 | 
			
		||||
	std_err("Cannot fork\n");
 | 
			
		||||
	exit(1);
 | 
			
		||||
  }
 | 
			
		||||
  if (pid == 0) execute();
 | 
			
		||||
 | 
			
		||||
  /* Parent is the time program.  Disable interrupts and wait. */
 | 
			
		||||
  signal(SIGINT, SIG_IGN);
 | 
			
		||||
  signal(SIGQUIT, SIG_IGN);
 | 
			
		||||
 | 
			
		||||
  do {
 | 
			
		||||
	times(&pre_buf);
 | 
			
		||||
  } while (wait(&status) != pid);
 | 
			
		||||
  read_tsc_64(&end_tsc);
 | 
			
		||||
  spent_tsc = end_tsc - start_tsc;
 | 
			
		||||
  end_time = times(&dummy);
 | 
			
		||||
  real_time = (end_time - start_time);
 | 
			
		||||
 | 
			
		||||
  if ((status & 0377) != 0) std_err("Command terminated abnormally.\n");
 | 
			
		||||
  times(&post_buf);
 | 
			
		||||
 | 
			
		||||
  if(cycles) {
 | 
			
		||||
  	fprintf(stderr, "%qd tsc ", spent_tsc);
 | 
			
		||||
  }
 | 
			
		||||
  /* Print results. -DNEW enables time on one line to 0.01 sec */
 | 
			
		||||
#ifndef NEW
 | 
			
		||||
  std_err("real ");
 | 
			
		||||
  print_time(real_time);
 | 
			
		||||
  std_err("\nuser ");
 | 
			
		||||
  print_time(post_buf.tms_cutime - pre_buf.tms_cutime);
 | 
			
		||||
  std_err("\nsys  ");
 | 
			
		||||
  print_time(post_buf.tms_cstime - pre_buf.tms_cstime);
 | 
			
		||||
  std_err("\n");
 | 
			
		||||
#else
 | 
			
		||||
  print_time(real_time);
 | 
			
		||||
  std_err(" real");
 | 
			
		||||
  print_time(post_buf.tms_cutime - pre_buf.tms_cutime);
 | 
			
		||||
  std_err(" user");
 | 
			
		||||
  print_time(post_buf.tms_cstime - pre_buf.tms_cstime);
 | 
			
		||||
  std_err(" sys\n");
 | 
			
		||||
#endif
 | 
			
		||||
  return((status & 0377) ? -1 : (status >> 8));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void print_time(t)
 | 
			
		||||
register clock_t t;
 | 
			
		||||
{
 | 
			
		||||
/* Print the time 't' in hours: minutes: seconds.  't' is in ticks. */
 | 
			
		||||
 | 
			
		||||
  int hours, minutes, seconds, hundredths, i;
 | 
			
		||||
  u32_t system_hz;
 | 
			
		||||
 | 
			
		||||
  system_hz = (u32_t) sysconf(_SC_CLK_TCK);
 | 
			
		||||
 | 
			
		||||
  digit_seen = 0;
 | 
			
		||||
  for (i = 0; i < 8; i++) a[i] = ' ';
 | 
			
		||||
  hours = (int) (t / ((clock_t) 3600 * system_hz));
 | 
			
		||||
  t -= (clock_t) hours * 3600 * system_hz;
 | 
			
		||||
  minutes = (int) (t / ((clock_t) 60 * system_hz));
 | 
			
		||||
  t -= (clock_t) minutes * 60 * system_hz;
 | 
			
		||||
  seconds = (int) (t / system_hz);
 | 
			
		||||
  t -= (clock_t) seconds * system_hz;
 | 
			
		||||
  hundredths = (int) (t * 100 / system_hz);
 | 
			
		||||
 | 
			
		||||
  if (hours) {
 | 
			
		||||
	twin(hours, &a[0]);
 | 
			
		||||
	a[2] = ':';
 | 
			
		||||
  }
 | 
			
		||||
  if (minutes || digit_seen) {
 | 
			
		||||
	twin(minutes, &a[3]);
 | 
			
		||||
	a[5] = ':';
 | 
			
		||||
  }
 | 
			
		||||
  if (seconds || digit_seen)
 | 
			
		||||
	twin(seconds, &a[6]);
 | 
			
		||||
  else
 | 
			
		||||
	a[7] = '0';
 | 
			
		||||
  a[9] = hundredths / 10 + '0';
 | 
			
		||||
#ifdef HUNDREDTHS		/* tenths used to be enough */
 | 
			
		||||
  a[10] = hundredths % 10 + '0';
 | 
			
		||||
#endif
 | 
			
		||||
  std_err(a);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void twin(n, p)
 | 
			
		||||
int n;
 | 
			
		||||
char *p;
 | 
			
		||||
{
 | 
			
		||||
  char c1, c2;
 | 
			
		||||
  c1 = (n / 10) + '0';
 | 
			
		||||
  c2 = (n % 10) + '0';
 | 
			
		||||
  if (digit_seen == 0 && c1 == '0') c1 = ' ';
 | 
			
		||||
  *p++ = c1;
 | 
			
		||||
  *p++ = c2;
 | 
			
		||||
  if (n > 0) digit_seen = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void execute()
 | 
			
		||||
{
 | 
			
		||||
  execvp(name, args);
 | 
			
		||||
  std_err("Cannot execute ");
 | 
			
		||||
  std_err(name);
 | 
			
		||||
  std_err("\n");
 | 
			
		||||
  exit(-1);
 | 
			
		||||
}
 | 
			
		||||
@ -25,7 +25,7 @@ SUBDIR= asa \
 | 
			
		||||
	\
 | 
			
		||||
	sdiff sed seq shar shlock \
 | 
			
		||||
	shuffle  sort split stat su \
 | 
			
		||||
	tail tee tic touch tput \
 | 
			
		||||
	tail tee tic time touch tput \
 | 
			
		||||
	tr true tsort tty ul uname unexpand unifdef \
 | 
			
		||||
	uniq units unvis unzip users \
 | 
			
		||||
	uudecode uuencode uuidgen vis \
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										16
									
								
								usr.bin/time/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								usr.bin/time/Makefile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
#	$NetBSD: Makefile,v 1.9 2011/08/28 08:24:42 christos Exp $
 | 
			
		||||
#	@(#)Makefile	8.1 (Berkeley) 6/6/93
 | 
			
		||||
 | 
			
		||||
.include <bsd.own.mk>
 | 
			
		||||
 | 
			
		||||
CPPFLAGS+=	-DNOT_CSH
 | 
			
		||||
CPPFLAGS+=	-I. -I${NETBSDSRCDIR}/bin
 | 
			
		||||
SRCS=	time.c xtime.c
 | 
			
		||||
PROG=	time
 | 
			
		||||
 | 
			
		||||
.PATH: ${NETBSDSRCDIR}/bin/csh
 | 
			
		||||
 | 
			
		||||
LDADD+=-lutil
 | 
			
		||||
DPADD+=${LIBUTIL}
 | 
			
		||||
 | 
			
		||||
.include <bsd.prog.mk>
 | 
			
		||||
							
								
								
									
										5
									
								
								usr.bin/time/ext.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								usr.bin/time/ext.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,5 @@
 | 
			
		||||
/*	$NetBSD: ext.h,v 1.2 2011/11/09 19:10:10 christos Exp $	*/
 | 
			
		||||
 | 
			
		||||
/* borrowed from ../../bin/csh/extern.h */
 | 
			
		||||
void prusage(FILE *, struct rusage *, struct rusage *, struct timespec *,
 | 
			
		||||
        struct timespec *);
 | 
			
		||||
							
								
								
									
										172
									
								
								usr.bin/time/time.1
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										172
									
								
								usr.bin/time/time.1
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,172 @@
 | 
			
		||||
.\"	$NetBSD: time.1,v 1.25 2011/11/09 19:42:27 wiz Exp $
 | 
			
		||||
.\"
 | 
			
		||||
.\" Copyright (c) 1980, 1991, 1993
 | 
			
		||||
.\"	The Regents of the University of California.  All rights reserved.
 | 
			
		||||
.\"
 | 
			
		||||
.\" Redistribution and use in source and binary forms, with or without
 | 
			
		||||
.\" modification, are permitted provided that the following conditions
 | 
			
		||||
.\" are met:
 | 
			
		||||
.\" 1. Redistributions of source code must retain the above copyright
 | 
			
		||||
.\"    notice, this list of conditions and the following disclaimer.
 | 
			
		||||
.\" 2. Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
.\"    notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
.\"    documentation and/or other materials provided with the distribution.
 | 
			
		||||
.\" 3. Neither the name of the University nor the names of its contributors
 | 
			
		||||
.\"    may be used to endorse or promote products derived from this software
 | 
			
		||||
.\"    without specific prior written permission.
 | 
			
		||||
.\"
 | 
			
		||||
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 | 
			
		||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 | 
			
		||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
			
		||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 | 
			
		||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 | 
			
		||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | 
			
		||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 | 
			
		||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | 
			
		||||
.\" SUCH DAMAGE.
 | 
			
		||||
.\"
 | 
			
		||||
.\"     @(#)time.1	8.1 (Berkeley) 6/6/93
 | 
			
		||||
.\"
 | 
			
		||||
.Dd November 9, 2011
 | 
			
		||||
.Dt TIME 1
 | 
			
		||||
.Os
 | 
			
		||||
.Sh NAME
 | 
			
		||||
.Nm time
 | 
			
		||||
.Nd time command execution
 | 
			
		||||
.Sh SYNOPSIS
 | 
			
		||||
.Nm
 | 
			
		||||
.Op Fl clp
 | 
			
		||||
.Ar command
 | 
			
		||||
.Op Ar argument ...
 | 
			
		||||
.Sh DESCRIPTION
 | 
			
		||||
The
 | 
			
		||||
.Nm
 | 
			
		||||
utility
 | 
			
		||||
executes and
 | 
			
		||||
times
 | 
			
		||||
.Ar command .
 | 
			
		||||
After the command finishes,
 | 
			
		||||
.Nm
 | 
			
		||||
writes the total elapsed time (wall clock time),
 | 
			
		||||
.Pq Dq real ,
 | 
			
		||||
the CPU time spent executing
 | 
			
		||||
.Ar command
 | 
			
		||||
at user level
 | 
			
		||||
.Pq Dq user ,
 | 
			
		||||
and the CPU time spent executing in the operating system kernel
 | 
			
		||||
.Pq Dq sys ,
 | 
			
		||||
to the standard error stream.
 | 
			
		||||
Times are reported in seconds.
 | 
			
		||||
.Pp
 | 
			
		||||
Available options:
 | 
			
		||||
.Bl -tag -width Ds
 | 
			
		||||
.It Fl c
 | 
			
		||||
Displays information in the format used by the
 | 
			
		||||
.Nm
 | 
			
		||||
builtin of
 | 
			
		||||
.Xr csh 1 .
 | 
			
		||||
.It Fl l
 | 
			
		||||
Lists resource utilization information.
 | 
			
		||||
The contents of the
 | 
			
		||||
.Ar command
 | 
			
		||||
process's
 | 
			
		||||
.Em rusage
 | 
			
		||||
structure are printed; see below.
 | 
			
		||||
.It Fl p
 | 
			
		||||
The output is formatted as specified by
 | 
			
		||||
.St -p1003.2-92 .
 | 
			
		||||
.El
 | 
			
		||||
.Pp
 | 
			
		||||
Some shells, such as
 | 
			
		||||
.Xr csh 1
 | 
			
		||||
and
 | 
			
		||||
.Xr ksh 1 ,
 | 
			
		||||
have their own and syntactically different built-in version of
 | 
			
		||||
.Nm .
 | 
			
		||||
The utility described here
 | 
			
		||||
is available as
 | 
			
		||||
.Pa /usr/bin/time
 | 
			
		||||
to users of these shells.
 | 
			
		||||
.Ss Resource Utilization
 | 
			
		||||
If the
 | 
			
		||||
.Fl l
 | 
			
		||||
option is given, the following resource usage
 | 
			
		||||
information is displayed
 | 
			
		||||
in addition to the timing information:
 | 
			
		||||
.Bl -item -offset indent -compact
 | 
			
		||||
.It
 | 
			
		||||
maximum resident set size
 | 
			
		||||
.It
 | 
			
		||||
average shared memory size
 | 
			
		||||
.It
 | 
			
		||||
average unshared data size
 | 
			
		||||
.It
 | 
			
		||||
average unshared stack size
 | 
			
		||||
.It
 | 
			
		||||
page reclaims
 | 
			
		||||
.It
 | 
			
		||||
page faults
 | 
			
		||||
.It
 | 
			
		||||
swaps
 | 
			
		||||
.It
 | 
			
		||||
block input operations
 | 
			
		||||
.It
 | 
			
		||||
block output operations
 | 
			
		||||
.It
 | 
			
		||||
messages sent
 | 
			
		||||
.It
 | 
			
		||||
messages received
 | 
			
		||||
.It
 | 
			
		||||
signals received
 | 
			
		||||
.It
 | 
			
		||||
voluntary context switches
 | 
			
		||||
.It
 | 
			
		||||
involuntary context switches
 | 
			
		||||
.El
 | 
			
		||||
Resource usage is the total for the execution of
 | 
			
		||||
.Ar command
 | 
			
		||||
and any child processes it spawns, as per
 | 
			
		||||
.Xr wait4 2 .
 | 
			
		||||
.Sh FILES
 | 
			
		||||
.Bl -tag -width Xsys/resource.hX -compact
 | 
			
		||||
.It Aq sys/resource.h
 | 
			
		||||
.El
 | 
			
		||||
.Sh EXIT STATUS
 | 
			
		||||
The
 | 
			
		||||
.Nm
 | 
			
		||||
utility exits with one of the following values:
 | 
			
		||||
.Bl -tag -width indent
 | 
			
		||||
.It 1-125
 | 
			
		||||
An error occurred in the
 | 
			
		||||
.Nm
 | 
			
		||||
utility.
 | 
			
		||||
.It 126
 | 
			
		||||
The
 | 
			
		||||
.Ar command
 | 
			
		||||
was found but could not be invoked.
 | 
			
		||||
.It 127
 | 
			
		||||
The
 | 
			
		||||
.Ar command
 | 
			
		||||
could not be found.
 | 
			
		||||
.El
 | 
			
		||||
.Pp
 | 
			
		||||
Otherwise, the exit status of
 | 
			
		||||
.Nm
 | 
			
		||||
will be that of
 | 
			
		||||
.Ar command .
 | 
			
		||||
.Sh SEE ALSO
 | 
			
		||||
.Xr csh 1 ,
 | 
			
		||||
.Xr ksh 1 ,
 | 
			
		||||
.Xr clock_gettime 2 ,
 | 
			
		||||
.Xr getrusage 2
 | 
			
		||||
.Sh STANDARDS
 | 
			
		||||
The
 | 
			
		||||
.Nm
 | 
			
		||||
utility conforms to
 | 
			
		||||
.St -p1003.2-92 .
 | 
			
		||||
.Sh BUGS
 | 
			
		||||
The granularity of seconds on microprocessors is crude and
 | 
			
		||||
can result in times being reported for CPU usage which are too large by
 | 
			
		||||
a second.
 | 
			
		||||
							
								
								
									
										209
									
								
								usr.bin/time/time.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										209
									
								
								usr.bin/time/time.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,209 @@
 | 
			
		||||
/*	$NetBSD: time.c,v 1.22 2011/11/09 19:10:10 christos Exp $	*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 1987, 1988, 1993
 | 
			
		||||
 *	The Regents of the University of California.  All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Redistribution and use in source and binary forms, with or without
 | 
			
		||||
 * modification, are permitted provided that the following conditions
 | 
			
		||||
 * are met:
 | 
			
		||||
 * 1. Redistributions of source code must retain the above copyright
 | 
			
		||||
 *    notice, this list of conditions and the following disclaimer.
 | 
			
		||||
 * 2. Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
 *    notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
 *    documentation and/or other materials provided with the distribution.
 | 
			
		||||
 * 3. Neither the name of the University nor the names of its contributors
 | 
			
		||||
 *    may be used to endorse or promote products derived from this software
 | 
			
		||||
 *    without specific prior written permission.
 | 
			
		||||
 *
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 | 
			
		||||
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
			
		||||
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 | 
			
		||||
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
			
		||||
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 | 
			
		||||
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 | 
			
		||||
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | 
			
		||||
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 | 
			
		||||
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | 
			
		||||
 * SUCH DAMAGE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <sys/cdefs.h>
 | 
			
		||||
#ifndef lint
 | 
			
		||||
__COPYRIGHT("@(#) Copyright (c) 1987, 1988, 1993\
 | 
			
		||||
 The Regents of the University of California.  All rights reserved.");
 | 
			
		||||
#endif /* not lint */
 | 
			
		||||
 | 
			
		||||
#ifndef lint
 | 
			
		||||
#if 0
 | 
			
		||||
static char sccsid[] = "@(#)time.c	8.1 (Berkeley) 6/6/93";
 | 
			
		||||
#endif
 | 
			
		||||
__RCSID("$NetBSD: time.c,v 1.22 2011/11/09 19:10:10 christos Exp $");
 | 
			
		||||
#endif /* not lint */
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/time.h>
 | 
			
		||||
#include <sys/resource.h>
 | 
			
		||||
#include <sys/wait.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <err.h>
 | 
			
		||||
#include <locale.h>
 | 
			
		||||
#include <signal.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
#include "ext.h"
 | 
			
		||||
 | 
			
		||||
__dead static void	usage(void);
 | 
			
		||||
static void	prl(long, const char *);
 | 
			
		||||
static void	prts(const char *, const char *, const struct timespec *,
 | 
			
		||||
    const char *);
 | 
			
		||||
static void	prtv(const char *, const char *, const struct timeval *,
 | 
			
		||||
    const char *);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
main(int argc, char ** volatile argv)
 | 
			
		||||
{
 | 
			
		||||
	int pid;
 | 
			
		||||
	int ch, status;
 | 
			
		||||
	int volatile portableflag;
 | 
			
		||||
	int volatile lflag;
 | 
			
		||||
	int volatile cshflag;
 | 
			
		||||
	const char *decpt;
 | 
			
		||||
	const struct lconv *lconv;
 | 
			
		||||
	struct timespec before, after;
 | 
			
		||||
	struct rusage ru;
 | 
			
		||||
 | 
			
		||||
	(void)setlocale(LC_ALL, "");
 | 
			
		||||
 | 
			
		||||
	cshflag = lflag = portableflag = 0;
 | 
			
		||||
	while ((ch = getopt(argc, argv, "clp")) != -1) {
 | 
			
		||||
		switch (ch) {
 | 
			
		||||
		case 'c':
 | 
			
		||||
			cshflag = 1;
 | 
			
		||||
			portableflag = 0;
 | 
			
		||||
			lflag = 0;
 | 
			
		||||
			break;
 | 
			
		||||
		case 'p':
 | 
			
		||||
			portableflag = 1;
 | 
			
		||||
			cshflag = 0;
 | 
			
		||||
			lflag = 0;
 | 
			
		||||
			break;
 | 
			
		||||
		case 'l':
 | 
			
		||||
			lflag = 1;
 | 
			
		||||
			portableflag = 0;
 | 
			
		||||
			cshflag = 0;
 | 
			
		||||
			break;
 | 
			
		||||
		case '?':
 | 
			
		||||
		default:
 | 
			
		||||
			usage();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	argc -= optind;
 | 
			
		||||
	argv += optind;
 | 
			
		||||
 | 
			
		||||
	if (argc < 1)
 | 
			
		||||
		usage();
 | 
			
		||||
 | 
			
		||||
	(void)clock_gettime(CLOCK_MONOTONIC, &before);
 | 
			
		||||
	switch(pid = vfork()) {
 | 
			
		||||
	case -1:			/* error */
 | 
			
		||||
		err(EXIT_FAILURE, "Vfork failed");
 | 
			
		||||
		/* NOTREACHED */
 | 
			
		||||
	case 0:				/* child */
 | 
			
		||||
		/* LINTED will return only on failure */
 | 
			
		||||
		execvp(*argv, argv);
 | 
			
		||||
		err((errno == ENOENT) ? 127 : 126, "Can't exec `%s'", *argv);
 | 
			
		||||
		/* NOTREACHED */
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* parent */
 | 
			
		||||
	(void)signal(SIGINT, SIG_IGN);
 | 
			
		||||
	(void)signal(SIGQUIT, SIG_IGN);
 | 
			
		||||
	if ((pid = wait4(pid, &status, 0, &ru)) == -1)
 | 
			
		||||
		err(EXIT_FAILURE, "wait4 %d failed", pid);
 | 
			
		||||
	(void)clock_gettime(CLOCK_MONOTONIC, &after);
 | 
			
		||||
	if (!WIFEXITED(status))
 | 
			
		||||
		warnx("Command terminated abnormally.");
 | 
			
		||||
	timespecsub(&after, &before, &after);
 | 
			
		||||
 | 
			
		||||
	if ((lconv = localeconv()) == NULL ||
 | 
			
		||||
	    (decpt = lconv->decimal_point) == NULL)
 | 
			
		||||
		decpt = ".";
 | 
			
		||||
 | 
			
		||||
	if (cshflag) {
 | 
			
		||||
		static struct rusage null_ru;
 | 
			
		||||
		before.tv_sec = 0;
 | 
			
		||||
		before.tv_nsec = 0;
 | 
			
		||||
		prusage(stderr, &null_ru, &ru, &after, &before);
 | 
			
		||||
	} else if (portableflag) {
 | 
			
		||||
		prts("real ", decpt, &after, "\n");
 | 
			
		||||
		prtv("user ", decpt, &ru.ru_utime, "\n");
 | 
			
		||||
		prtv("sys  ", decpt, &ru.ru_stime, "\n");
 | 
			
		||||
	} else {
 | 
			
		||||
		prts("", decpt, &after, " real ");
 | 
			
		||||
		prtv("", decpt, &ru.ru_utime, " user ");
 | 
			
		||||
		prtv("", decpt, &ru.ru_stime, " sys\n");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (lflag) {
 | 
			
		||||
		int hz = (int)sysconf(_SC_CLK_TCK);
 | 
			
		||||
		unsigned long long ticks;
 | 
			
		||||
#define SCALE(x) (long)(ticks ? x / ticks : 0)
 | 
			
		||||
 | 
			
		||||
		ticks = hz * (ru.ru_utime.tv_sec + ru.ru_stime.tv_sec) +
 | 
			
		||||
		    hz * (ru.ru_utime.tv_usec + ru.ru_stime.tv_usec) / 1000000;
 | 
			
		||||
		prl(ru.ru_maxrss, "maximum resident set size");
 | 
			
		||||
		prl(SCALE(ru.ru_ixrss), "average shared memory size");
 | 
			
		||||
		prl(SCALE(ru.ru_idrss), "average unshared data size");
 | 
			
		||||
		prl(SCALE(ru.ru_isrss), "average unshared stack size");
 | 
			
		||||
		prl(ru.ru_minflt, "page reclaims");
 | 
			
		||||
		prl(ru.ru_majflt, "page faults");
 | 
			
		||||
		prl(ru.ru_nswap, "swaps");
 | 
			
		||||
		prl(ru.ru_inblock, "block input operations");
 | 
			
		||||
		prl(ru.ru_oublock, "block output operations");
 | 
			
		||||
		prl(ru.ru_msgsnd, "messages sent");
 | 
			
		||||
		prl(ru.ru_msgrcv, "messages received");
 | 
			
		||||
		prl(ru.ru_nsignals, "signals received");
 | 
			
		||||
		prl(ru.ru_nvcsw, "voluntary context switches");
 | 
			
		||||
		prl(ru.ru_nivcsw, "involuntary context switches");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return (WIFEXITED(status) ? WEXITSTATUS(status) : EXIT_FAILURE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
usage(void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	(void)fprintf(stderr, "Usage: %s [-clp] utility [argument ...]\n",
 | 
			
		||||
	    getprogname());
 | 
			
		||||
	exit(EXIT_FAILURE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
prl(long val, const char *expn)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	(void)fprintf(stderr, "%10ld  %s\n", val, expn);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
prts(const char *pre, const char *decpt, const struct timespec *ts,
 | 
			
		||||
    const char *post)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	(void)fprintf(stderr, "%s%9lld%s%02ld%s", pre, (long long)ts->tv_sec,
 | 
			
		||||
	    decpt, (long)ts->tv_nsec / 10000000, post);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
prtv(const char *pre, const char *decpt, const struct timeval *tv,
 | 
			
		||||
    const char *post)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	(void)fprintf(stderr, "%s%9lld%s%02ld%s", pre, (long long)tv->tv_sec,
 | 
			
		||||
	    decpt, (long)tv->tv_usec / 10000, post);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										9
									
								
								usr.bin/time/xtime.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								usr.bin/time/xtime.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
			
		||||
/*	$NetBSD: xtime.c,v 1.1 2007/02/24 21:30:27 matt Exp $	*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <sys/time.h>
 | 
			
		||||
#include <sys/resource.h>
 | 
			
		||||
#include "ext.h"
 | 
			
		||||
#include "csh/time.c"
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user