Listing 1: mon.c Source Code
1 /*
2 * mon.c
3 * Copyright 1992, Chris Hare
4 */
5
6 #include <sys/types.h> /* system primitives
7 #include <sys/param.h> /* system configuration parameters
8 #include <sys/page.h> /* system memory management
9 #include <sys/immu.h> /* system intel memory management
10 #include <sys/region.h> /* system process region configuration
11 #include <sys/proc.h> /* process table structure */
12 #include <sys/var.h> /* system configuration */
13 #include <sys/dir.h> /* File system header */
14 #include <sys/user.h> /* u-area information */
15 #include <sys/sysi86.h> /* SCO UNIX SPECIFIC - this header is used
16 to provide support for the sysi86
17 function which is used to retrive the
18 process u-area. */
19 #include <sys/file.h> /* system file table structure */
20 #include <stdio.h> /* standard libary header */
21 #include <fcntl.h> /* file control header */
22 #include <nlist.h> /* system namelist structure */
23 #include <pwd.h>
24 #include <string.h> /* string functions */
25 #include <memory.h> /* memory management functions */
26
27 struct nlist names[] = {
28 "proc", 0, 0, 0, 0, 0,
29 "v", 0, 0, 0, 0, 0,
30 "file", 0, 0, 0, 0, 0,
31 0, 0, 0, 0, 0, 0,
32 };
33
34 proc_t p; /* process structure */
35 struct var v; /* namelist structure */
36 struct file file_table; /* file table structure */
37 int NOFILES; /* open file counter */
38
39 char *Usage = "Usage: mon\n"; /* error message */
40
41 main(argc, argv)
42 int argc;
43 char *argv[];
44 {
45
46 int k_fd; /* kernel filedescriptor */
47
48 /* call nlist(S) to fill out values in names[]; */
49 nlist( "/unix", names );
50
51 /* open /dev/kmem, readonly;*/
52 k_fd = open( "/dev/kmem", O_RDONLY );
53 if ( k_fd < 0 )
54 {
55 perror("/dev/kmem");
56 exit(1);
57 }
58 /* call domon() to read the process table and print the results;*/
59 domon(k_fd);
60
61 close( k_fd );
62 exit(0);
63
64 }
65
66 /*
67 * domon()
68 *
69 * lseek, and then read the process table from /dev/kmem
70 */
71
72 domon(fd)
73 int fd;
74 {
75
76 int bytes_seek = 0;
77 int p_no = 0;
78 /*int p_used = 0;*/
79 char *Pp_used;
80 int p_used = 0;
81 struct proc p_entry;
82 long proc_table = names[0].n_value;
83 long var_table = names[1].n_value;
84
85 /* seek to the struct v, and read it; */
86 bytes_seek = lseek( fd, var_table, 0 );
87 read( fd, &v, sizeof(v) );
88 NOFILES = v.v_nofiles;
89 /*
90 calculate the current extent of the process table, based
91 on v.ve_proc;
92 */
93 p_used = ( ( (long)v.ve_proc - proc_table ) / sizeof(p_entry) );
94 /* seek to the process table; */
95 bytes_seek = lseek( fd, proc_table, 0 );
96 /*
97 print a header on the screen;
98 */
99 dohdr();
100
101 for( p_no = 0; p_no < p_used; p_no++ )
102 {
103 /* read the process table entry;*/
104 bytes_seek = read( fd, &p_entry, sizeof(p_entry) );
105
106 /*
107 if p_stat is valid,
108 call doproc() to display the proc entry;
109 */
110 if ( p_entry.p_stat > 0 )
111 doproc( &p_entry );
112 }
113 printf( "--\nCONFIG : %d ALLOC : %d\n", v.v_proc, p_used );
114
115 }
116
117 /*
118 * dohdr()
119 *
120 * print column headers
121 */
122
123 dohdr()
124 {
125 printf( "STATUS FLAGS PID PPID USERID PRI NI C OF TTY COMMAND\n");
126 }
127
128 /*
129 * doproc()
130 *
131 * print process table entry
132 */
133
134 doproc(pp)
135 proc_t *pp;
136 {
137 char *p_state[8] = { "", "SSLEEP", "SRUN",
"SZOMB",
138 "SSTOP", "SIDL", "SONPROC",
"SXBRK" };
139
140 struct passwd *getpwuid(); /* define the subroutine */
141 struct passwd *pw; /* where to put the data */
142 struct user u_buf;
143 char pflag[6];
144 int x;
145 int ret;
146 char cmd[PSARGSZ];
147
148 /* get the real user name for this process */
149 pw = getpwuid( pp->p_uid );
150 /* get the u-block for the process and stuff it into a buffer */
151 ret = sysi86( RDUBLK, pp->p_pid, &u_buf, sizeof(u_buf) );
152 memset( cmd, 0x00, PSARGSZ );
153 if ( ret < 0 )
154 strcpy( cmd, "<defunct>" );
155 else
156 strcpy( cmd, u_buf.u_psargs );
157 /* find out how many files this process has open */
158 for (x = 0; x< NOFILES; x++ )
159 {
160 if ( u_buf.u_ofile[x] == (char *)0 )
161 break;
162 }
163 /* is this process in ram, or on swap? */
164 memset( pflag, 0x00, sizeof(pflag) );
165 if ( ( pp->p_flag & 0x00000001 ) == 1 )
166 strcpy( pflag, "SYS" );
167 else if ( ( pp->p_flag & 0x00000008 ) == 0x8 )
168 strcpy( pflag, "NWAKE" );
169 else if ( ( pp->p_flag & 0x00000020 ) == 0x20 )
170 strcpy( pflag, "LOCK" );
171 else if ( ( pp->p_flag & 0x00020000 ) == 0x20000 )
172 strcpy( pflag, "ASLP" );
173 else if ( ( pp->p_flag & 0x01000000 ) == 0x01000000 )
174 strcpy( pflag, "EXIT" );
175 else if ( ( pp->p_flag & 0x00000010 ) == 0x10 )
176 strcpy( pflag, "CORE" );
177 else
178 strcpy( pflag, "SWAP" );
179 /*print the process table entry described by pp;*/
180 /* STATE FLAGS PID PPID UID PRI NI C FILES CMD*/
181 printf( "%-7s %-5s %-6d %-6d %-8s %-3d %-2d %-2d %2d %-s\n",
182 p_state[pp->p_stat], pflag, pp->p_pid, pp->p_ppid,
183 pw->pw_name, pp->p_pri, pp->p_nice, pp->p_cpu, x, cmd );
184 return(0);
185 }
|