uptime for System V

sjm sjm at dayton.UUCP
Sat Sep 20 06:44:00 AEST 1986


Well, it happens to the best of us (which certainly excludes me :-)
Two days after posting the original uptime.c program for Sys V,
Paul Jatkowski @ cuuxb reminds me that the times() call will
return the number of clock ticks since boot time. (Though
the System V definition only says that it will return some
arbitrary number of ticks (e.g. clock ticks)). Anyway, needless
to say this is a much faster method of determining uptime 
(although not as fun :-) than reading kernel memory. This 
version also doesn't need to be set uid-ed.

Also, an option (any argument) will instead cause the date
of the last boot.

---------------------------CUT HERE------------------------------
/*
 *	uptime.c -- Print how long the system has been up 
 *				System V Implmenentation
 *
 *	8/19/86	- Version 1.0
 *		(sjm at dayton)	Steven McDowall
 *
 *	9/19/86 - Version 1.1
 *	  Get boot time much faster from times() call
 *		(pej at cuuxb)		Paul Jatkowski
 *
 *	cc -O -o uptime uptime.c
 */

# include <sys/types.h>			/* system types */
# include <sys/param.h>			/* for HZ */
# include <sys/times.h>
# include <time.h>

#define	MINUTES	60
#define HOURS	(MINUTES * 60)
#define DAYS	(HOURS * 24)

int		memfd;

main(argc, argv)
int  argc;
char *argv[];
{
	time_t	uptime, times();
	struct  tm  *ts;
	struct	tms tbuf;
	void	ptime();

	
/*
	Get the number of clock cycles the system has been running
	and divide by the clock rate (HZ) to get seconds
*/
	uptime = (times(tbuf) / HZ);

/*
	Print out information in one of 2 formats
*/
	if (argc > 1)				/* assume we want boot date */
	{
		uptime = time((long *) 0) - uptime;
		ts = localtime(&uptime);
		printf("System was last booted on %s", asctime(ts));
	}
	else						/* we want old uptime format */
		ptime(uptime);

} /* main */

/*
	Print the time in a nice format 
*/
void ptime(secs)
time_t secs;
{
	short	days, hours, minutes;

	secs -= (days = secs / DAYS) * DAYS;
	secs -= (hours = secs / HOURS) * HOURS;
	secs -= (minutes = secs / MINUTES) * MINUTES;

	printf("The system has been up for ");
	if (days != 0)
		printf("%d %s ", days, (days == 1 ? "day" : "days"));
	if (hours != 0)
		printf("%d %s ", hours, (hours == 1 ? "hour" : "hours"));
	if (minutes != 0)
		printf("%d %s ", minutes, (minutes == 1 ? "minute" : "minutes"));
	printf("and %d %s.\n", secs, (secs == 1 ? "second" : "seconds"));
}
-- 
Steven J. McDowall	
Dayton-Hudson Dept. Store. Co.		UUCP: ihnp4!rosevax!dayton!sjm
700 on the Mall				ATT:  1 612 375 2816
Mpls, Mn. 55408



More information about the Comp.sources.unix mailing list