DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download
Index: ┃ T m

⟦0056948eb⟧ TextFile

    Length: 3446 (0xd76)
    Types: TextFile
    Names: »mon.c«

Derivation

└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
    └─ ⟦this⟧ »EUUGD11/euug-87hel/sec8/mon/mon.c« 

TextFile

/*
 *			M O N . C
 *
 *  A program to moniter system activity.
 *   Rework of earlier mon program.  17 Aug 84 - Phillip Dykstra
 *
 */

#include "mon.h"
#include <curses.h>
#include <signal.h>

struct	sgttyb ttyb;
int done();

/*
 *  The namelist array.  Uses to get the kernal variables needed
 *  by all the MON routines.  The order of this list MUST correspond
 *  to the order of the definitions in mon.h
 */
struct nlist namelist[] = {
	{ "_dk_busy" },
	{ "_dk_mspw" },
	{ "_hz" },
	{ "_cp_time" },
	{ "_rate" },
	{ "_total" },
	{ "_deficit" },
	{ "_dk_xfer" },
	{ "_mbdinit" },
	{ "_ubdinit" },
	{ "_ifnet" },
	{ "_dk_time" },
	{ "_dk_wds" },
	{ "_dk_seek" },
	{ "_tk_nin" },
	{ "_tk_nout" },
	{ "_avenrun" },
	{ "_cp2_time" },	/* 2nd CPU stats */
	{ "_slavestart" },	/* Used to detect 2nd CPU */
	{ 0 }
};

main(argc,argv)
int argc;
char *argv[];
{
        register i;
        double f1, f2;
        extern char *ctime();

/*
 * fill the namelist and open /dev/kmem
 */
        nlist("/vmunix", namelist);
        if(namelist[X_DK_BUSY].n_type == 0) {
                printf("dk_busy not found in /vmunix namelist\n");
                exit(1);
        }
        kmem = open("/dev/kmem", 0);
        if(kmem < 0) {
                printf("cannot open /dev/kmem\n");
                exit(1);
        }
        if(argc > 1)
                intv = (atoi(argv[1]));
        else intv = 1;

/* 
 * do all things that need to be done only once
 */
        lseek(kmem, (long)namelist[X_DK_MSPW].n_value, 0);
        read(kmem, s.dk_mspw, sizeof s.dk_mspw);
        lseek(kmem, (long)namelist[X_HZ].n_value, 0);
        read(kmem, &hz, sizeof hz);
	read_names();
	dualcpu = 0;
	if (namelist[X_SLAVESTART].n_type)
		dualcpu++;        
/*
 * monitor parameters forever
 */
        worker();
        /* NOTREACHED */
}

char obuf[BUFSIZ];	/* Output buffer */

worker()
{
        long clock;
	struct timeval tintv;
	int i, tin;
	int users, user_count();

	/* set up signals */
	signal(SIGINT, done);
	signal(SIGQUIT, done);

	/* set CBREAK mode with no buffering on stdin */
	setbuf(stdin, 0);
	setbuf(stdout, obuf);
	ioctl(0, TIOCGETP, &ttyb);
	ttyb.sg_flags |= CBREAK;
	ioctl(fileno(stdin), TIOCSETP, (char *)&ttyb);

	tintv.tv_sec = intv;
	tintv.tv_usec = 0;
	initscr();	/* init curses package */
	nifinit();	/* get initial net interfaces data */
        dispinit();     /* initialize display */
        for(;;){
                vm();
                io();
        	nifupdate();
        	/* get load average */
		lseek(kmem, (long)namelist[LOADAV].n_value, 0);
		read(kmem, &loadavg[0], sizeof loadavg);
        	mvprintw(0,13,"%4.2f %4.2f %4.2f %4.2f", loadavg[3], loadavg[0], loadavg[1], loadavg[2]);
                time(&clock);
                mvprintw(0,40,ctime(&clock));

		users = user_count();
		if (users == 1)
		    mvprintw(0, 70, "1 user");
		else
		    mvprintw(0, 70, "%d users", users);

        	dispupdate();
        	mvprintw(23, 0, "CMD> ");
                refresh();
        	tin = 1;
        	i = select(2, &tin, (int *)0, (int *)0, &tintv);
        	if (i && tin) {
        		i = getchar();
        		if (i == 12)
				dispinit();
        		else if (i == 'q')
        			done();
        	}
        }
}

/*
 * DONE - put the term back in non CBREAK mode and exit.
 */
done()
{
	ioctl(0, TIOCGETP, &ttyb);
	ttyb.sg_flags &= ~CBREAK;
	ioctl(fileno(stdin), TIOCSETP, (char *)&ttyb);
	mvprintw(23,0,"\n");
	refresh();
	exit(1);
}