source: trunk/athena/bin/mon/mon.c @ 2

Revision 2, 3.6 KB checked in by dgg, 37 years ago (diff)
Initial revision
Line 
1/*
2 *      $Source: /afs/dev.mit.edu/source/repository/athena/bin/mon/mon.c,v $
3 *      $Author: dgg $
4 *      $Locker:  $
5 *      $Header: /afs/dev.mit.edu/source/repository/athena/bin/mon/mon.c,v 1.1 1984-12-13 12:00:58 dgg Exp $
6 */
7
8#ifndef lint
9static char *rcsid_mon_c = "$Header: /afs/dev.mit.edu/source/repository/athena/bin/mon/mon.c,v 1.1 1984-12-13 12:00:58 dgg Exp $";
10#endif  lint
11
12/*
13 *                      M O N . C
14 *
15 *  A program to moniter system activity.
16 *   Rework of earlier mon program.  17 Aug 84 - Phillip Dykstra
17 *
18 */
19
20#include "mon.h"
21#include <curses.h>
22#include <signal.h>
23
24struct  sgttyb ttyb;
25int done();
26
27/*
28 *  The namelist array.  Uses to get the kernal variables needed
29 *  by all the MON routines.  The order of this list MUST correspond
30 *  to the order of the definitions in mon.h
31 */
32struct nlist namelist[] = {
33        { "_dk_busy" },
34        { "_dk_mspw" },
35        { "_hz" },
36        { "_cp_time" },
37        { "_rate" },
38        { "_total" },
39        { "_deficit" },
40        { "_dk_xfer" },
41        { "_mbdinit" },
42        { "_ubdinit" },
43        { "_ifnet" },
44        { "_dk_time" },
45        { "_dk_wds" },
46        { "_dk_seek" },
47        { "_tk_nin" },
48        { "_tk_nout" },
49        { "_avenrun" },
50        { "_cp2_time" },        /* 2nd CPU stats */
51        { "_slavestart" },      /* Used to detect 2nd CPU */
52        { 0 }
53};
54
55main(argc,argv)
56int argc;
57char *argv[];
58{
59        register i;
60        double f1, f2;
61        extern char *ctime();
62
63/*
64 * fill the namelist and open /dev/kmem
65 */
66        nlist("/vmunix", namelist);
67        if(namelist[X_DK_BUSY].n_type == 0) {
68                printf("dk_busy not found in /vmunix namelist\n");
69                exit(1);
70        }
71        kmem = open("/dev/kmem", 0);
72        if(kmem < 0) {
73                printf("cannot open /dev/kmem\n");
74                exit(1);
75        }
76        if(argc > 1)
77                intv = (atoi(argv[1]));
78        else intv = 1;
79
80/*
81 * do all things that need to be done only once
82 */
83        lseek(kmem, (long)namelist[X_DK_MSPW].n_value, 0);
84        read(kmem, s.dk_mspw, sizeof s.dk_mspw);
85        lseek(kmem, (long)namelist[X_HZ].n_value, 0);
86        read(kmem, &hz, sizeof hz);
87        read_names();
88        dualcpu = 0;
89        if (namelist[X_SLAVESTART].n_type)
90                dualcpu++;       
91/*
92 * monitor parameters forever
93 */
94        worker();
95        /* NOTREACHED */
96}
97
98char obuf[BUFSIZ];      /* Output buffer */
99
100worker()
101{
102        long clock;
103        struct timeval tintv;
104        int i, tin;
105
106        /* set up signals */
107        signal(SIGINT, done);
108        signal(SIGQUIT, done);
109
110        /* set CBREAK mode with no buffering on stdin */
111        setbuf(stdin, 0);
112        setbuf(stdout, obuf);
113        ioctl(0, TIOCGETP, &ttyb);
114        ttyb.sg_flags |= CBREAK;
115        ioctl(fileno(stdin), TIOCSETP, (char *)&ttyb);
116
117        tintv.tv_sec = intv;
118        tintv.tv_usec = 0;
119        initscr();      /* init curses package */
120        nifinit();      /* get initial net interfaces data */
121        dispinit();     /* initialize display */
122        for(;;){
123                vm();
124                io();
125                nifupdate();
126                /* get load average */
127                lseek(kmem, (long)namelist[LOADAV].n_value, 0);
128                read(kmem, &loadavg[0], sizeof loadavg);
129                mvprintw(0,13,"%4.2f %4.2f %4.2f %4.2f", loadavg[3], loadavg[0], loadavg[1], loadavg[2]);
130                time(&clock);
131                mvprintw(0,40,ctime(&clock));
132                dispupdate();
133                mvprintw(23, 0, "CMD> ");
134                refresh();
135                tin = 1;
136                i = select(2, &tin, (int *)0, (int *)0, &tintv);
137                if (i && tin) {
138                        i = getchar();
139                        if (i == 12)
140                                dispinit();
141                        else if (i == 'q')
142                                done();
143                }
144        }
145}
146
147/*
148 * DONE - put the term back in non CBREAK mode and exit.
149 */
150done()
151{
152        ioctl(0, TIOCGETP, &ttyb);
153        ttyb.sg_flags &= ~CBREAK;
154        ioctl(fileno(stdin), TIOCSETP, (char *)&ttyb);
155        mvprintw(23,0,"\n");
156        refresh();
157        exit(1);
158}
Note: See TracBrowser for help on using the repository browser.