home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3885 < prev    next >
Text File  |  1991-08-22  |  8KB  |  309 lines

  1. Xref: wupost alt.sources:3885 comp.unix.xenix.sco:4067
  2. Path: wupost!cs.utexas.edu!chinacat!chip
  3. From: chip@chinacat.unicom.com (Chip Rosenthal)
  4. Newsgroups: alt.sources,comp.unix.xenix.sco
  5. Subject: freemem - report memory usage statistics for SCO XENIX
  6. Message-ID: <1991Aug23.001931.13907@chinacat.unicom.com>
  7. Date: 23 Aug 91 00:19:31 GMT
  8. Followup-To: comp.unix.xenix.sco
  9. Organization: Unicom Systems Development, Inc.
  10. Lines: 297
  11.  
  12. This utility is a little hack for SCO XENIX/386.  It reports main
  13. memory and swap memory usage.  I'd rather have sar, but this will
  14. do in a pinch.
  15.  
  16.  
  17. #! /bin/sh
  18. # this is a "shar" archive - run through "/bin/sh" to extract 3 files:
  19. #   README freemem.c freemem.1
  20. # Wrapped by chip@chinacat on Thu Aug 22 19:16:43 CDT 1991
  21. # Unpacking this archive requires:  sed test wc (possibly mkdir)
  22. # Existing files will not be clobbered unless "-c" is specified on the cmd line.
  23. if test -f README -a "$1" != "-c" ; then
  24.     echo "README: file exists - will not be overwritten"
  25. else
  26.     echo "x - README (file 1 of 3, 933 chars)"
  27.     sed -e 's/^X//' << 'END_OF_FILE_README' > README
  28. X
  29. Xfreemem - report memory usage statistics for SCO XENIX.
  30. X
  31. XRun without any arguments, it produces a report such as:
  32. X
  33. X    $ freemem
  34. X    memory: 9172KB avail, 5164KB used  swap: 8192KB avail, 0KB used
  35. X
  36. XIf a sampling interval is specified, it produces results such as:
  37. X
  38. X    $ freemem 30
  39. X    #  physmem   maxmem availmem  usedmem    totswp availswp  usedswp
  40. X     14336    11940     9532     4804      8192     8192        0
  41. X     14336    11940     9116     5220      8192     8192        0
  42. X     14336    11940     8868     5468      8192     8192        0
  43. X     14336    11940     8656     5680      8192     8192        0
  44. X
  45. XThis utility needs read access to both /xenix and /dev/kmem - thus
  46. Xwill probably have to be installed setuid to `sysinfo'.  It has been
  47. Xtested on SCO XENIX/386 2.3.3.
  48. X
  49. XWell...it ain't sar - but we gotta make due...
  50. X
  51. XChip Rosenthal
  52. XUnicom Systems Development, Inc.
  53. X<chip@chinacat.unicom.com>
  54. X
  55. X@(#) README 1.1 91/08/22 19:16:17
  56. X
  57. END_OF_FILE_README
  58.     size="`wc -c < README`"
  59.     if test 933 -ne "$size" ; then
  60.     echo "README: extraction error - got $size chars"
  61.     fi
  62. fi
  63. if test -f freemem.c -a "$1" != "-c" ; then
  64.     echo "freemem.c: file exists - will not be overwritten"
  65. else
  66.     echo "x - freemem.c (file 2 of 3, 3329 chars)"
  67.     sed -e 's/^X//' << 'END_OF_FILE_freemem.c' > freemem.c
  68. X#ifndef lint
  69. Xstatic char SCCSID[] = "@(#) freemem.c 1.1 91/08/22 19:16:17";
  70. X#endif
  71. X
  72. X/*
  73. X * freemem - report memory usage statistics for SCO XENIX.
  74. X *
  75. X * Chip Rosenthal
  76. X * Unicom Systems Development, Inc.
  77. X * <chip@chinacat.unicom.com>
  78. X *
  79. X * Edit at tabstops=4.
  80. X */
  81. X
  82. X#include <stdio.h>
  83. X#include <fcntl.h>
  84. X#include <a.out.h>
  85. X#include <sys/param.h>
  86. X#include <sys/sysmacros.h>
  87. X
  88. X#define USAGE    "usage: %s [-c corefile] [-n namelist] [sample_interval]\n"
  89. X#define KERNEL    "/xenix"
  90. X#define KMEM    "/dev/kmem"
  91. X#define KB(X)    (ctob(X)/1024)
  92. X#define TRUE    1
  93. X#define FALSE    0
  94. X
  95. X#define V_AVAILMEM    0
  96. X#define V_MAXMEM    1
  97. X#define V_PHYSMEM    2
  98. X#define V_AVAILSWP    3
  99. X#define V_TOTSWP    4
  100. X
  101. Xstruct xlist v[] = {
  102. X    { 0, 0, 0L, "_availmem" },
  103. X    { 0, 0, 0L, "_maxmem" },
  104. X    { 0, 0, 0L, "_physmem" },
  105. X    { 0, 0, 0L, "_availswp" },
  106. X    { 0, 0, 0L, "_totswp" },
  107. X    { 0, 0, 0L, (char *)0 },
  108. X};
  109. X
  110. X
  111. Xchar *Kernel = KERNEL;
  112. Xchar *Kmem = KMEM;
  113. X
  114. Xvoid ksample();
  115. Xvoid kread();
  116. X
  117. X
  118. Xmain(argc, argv)
  119. Xint argc;
  120. Xchar *argv[];
  121. X{
  122. X    int availmem, maxmem, physmem, availswp, totswp;
  123. X    int interval, fd, line, i;
  124. X    extern int optind;
  125. X    extern char *optarg;
  126. X
  127. X    while ((i = getopt(argc, argv, "c:n:")) != EOF) {
  128. X        switch (i) {
  129. X        case 'c':
  130. X            if (getuid() != 0) {
  131. X                fprintf(stderr, "%s: '-c' restricted to root\n", argv[0]);
  132. X                exit(1);
  133. X            }
  134. X            Kmem = optarg;
  135. X            break;
  136. X        case 'n':
  137. X            if (getuid() != 0) {
  138. X                fprintf(stderr, "%s: '-n' restricted to root\n", argv[0]);
  139. X                exit(1);
  140. X            }
  141. X            Kernel = optarg;
  142. X            break;
  143. X        default:
  144. X            fprintf(stderr, USAGE, argv[0]);
  145. X            exit(1);
  146. X        }
  147. X    }
  148. X
  149. X    switch (argc-optind) {
  150. X    case 0:
  151. X        interval = 0;
  152. X        break;
  153. X    case 1:
  154. X        if ((interval = atoi(argv[optind])) <= 0) {
  155. X            fprintf(stderr, "%s: bad sample interval '%s'\n",
  156. X                argv[0], argv[optind]);
  157. X            exit(1);
  158. X        }
  159. X        break;
  160. X    default:
  161. X        fprintf(stderr, USAGE, argv[0]);
  162. X        exit(1);
  163. X    }
  164. X
  165. X    if (xlist(Kernel, v) != 0) {
  166. X        perror(Kernel);
  167. X        exit(1);
  168. X    }
  169. X    if ((fd = open(Kmem, O_RDONLY)) < 0) {
  170. X        perror(Kmem);
  171. X        exit(1);
  172. X    }
  173. X
  174. X    if (interval == 0) {
  175. X        ksample(fd, &maxmem, &physmem, &availmem, &availswp, &totswp);
  176. X        printf(
  177. X            "memory: %dKB avail, %dKB used  swap: %dKB avail, %dKB used\n",
  178. X            KB(availmem), KB(physmem-availmem),
  179. X            KB(availswp), KB(totswp-availswp));
  180. X        (void) close(fd);
  181. X        exit(0);
  182. X    }
  183. X
  184. X    line = 0;
  185. X    for (;;) {
  186. X
  187. X        ksample(fd, &maxmem, &physmem, &availmem, &availswp, &totswp);
  188. X
  189. X        if (line++ % 22 == 0) {
  190. X            printf("# %8s %8s %8s %8s  %8s %8s %8s\n",
  191. X                "physmem", "maxmem", "availmem", "usedmem",
  192. X                "totswp", "availswp", "usedswp"
  193. X            );
  194. X        }
  195. X
  196. X        printf("  %8d %8d %8d %8d  %8d %8d %8d\n",
  197. X            KB(physmem), KB(maxmem), KB(availmem), KB(physmem-availmem),
  198. X            KB(totswp), KB(availswp), KB(totswp-availswp));
  199. X
  200. X        (void) sleep(interval);
  201. X
  202. X    }
  203. X
  204. X    (void) close(fd);
  205. X    exit(0);
  206. X    /*NOTREACHED*/
  207. X}
  208. X
  209. Xvoid ksample(fd, maxmem, physmem, availmem, availswp, totswp)
  210. Xint fd;
  211. Xint *maxmem, *physmem, *availmem, *availswp, *totswp;
  212. X{
  213. X        kread(fd, v[V_MAXMEM].xl_value, (char *)maxmem, sizeof(int));
  214. X        kread(fd, v[V_PHYSMEM].xl_value, (char *)physmem, sizeof(int));
  215. X        kread(fd, v[V_AVAILMEM].xl_value, (char *)availmem, sizeof(int));
  216. X        kread(fd, v[V_AVAILSWP].xl_value, (char *)availswp, sizeof(int));
  217. X        kread(fd, v[V_TOTSWP].xl_value, (char *)totswp, sizeof(int));
  218. X}
  219. X
  220. X
  221. Xvoid kread(fd, pos, ptr, nbyte)
  222. Xint fd;
  223. Xlong pos;
  224. Xchar *ptr;
  225. Xunsigned nbyte;
  226. X{
  227. X    if (lseek(fd, pos, 0) < 0 || read(fd, ptr, nbyte) != nbyte) {
  228. X        perror(Kmem);
  229. X        exit(1);
  230. X    }
  231. X}
  232. X
  233. END_OF_FILE_freemem.c
  234.     size="`wc -c < freemem.c`"
  235.     if test 3329 -ne "$size" ; then
  236.     echo "freemem.c: extraction error - got $size chars"
  237.     fi
  238. fi
  239. if test -f freemem.1 -a "$1" != "-c" ; then
  240.     echo "freemem.1: file exists - will not be overwritten"
  241. else
  242.     echo "x - freemem.1 (file 3 of 3, 1249 chars)"
  243.     sed -e 's/^X//' << 'END_OF_FILE_freemem.1' > freemem.1
  244. X.\" @(#) freemem.1 1.1 91/08/22 19:16:17
  245. X.TH FREEMEM 1L
  246. X.SH NAME
  247. Xfreemem - Display system memory and swap usage.
  248. X.SH SYNTAX
  249. X.B freemem
  250. X[
  251. X.B \-c
  252. Xcorefile ] [
  253. X.B \-n
  254. Xnamelist ] [ sample_interval ]
  255. X.SH DESCRIPTION
  256. X.I Freemem
  257. Xdisplay statistics on system main and swap memory usage.  If a
  258. X.I sample_interval
  259. Xin seconds is given, then
  260. X.I freemem
  261. Xruns continuously providing a measurement at the specified intervals.
  262. X.P
  263. XAll values are reported in kilobytes.  The following items are reported:
  264. X.IP physmem 12
  265. XThe physical memory in the system.
  266. X.IP maxmem 12
  267. XThe amount of memory available to user processes.  The difference between
  268. X.I physmem
  269. Xand
  270. X.I maxmem
  271. Xis the amount of memory used by the kernel code and data.
  272. X.IP availmem 12
  273. XThe amount of memory currently unused.
  274. X.IP usedmem 12
  275. XThe amount of memory currently in use by the kernel and user processes.
  276. X.IP totswp 12
  277. XThe size of the swap disk division.
  278. X.IP availswp 12
  279. XThe amount of swap currently unused.
  280. X.IP usedswp 12
  281. XThe amount of swap currently in use.
  282. X.SH FILES
  283. X/xenix
  284. X.br
  285. X/dev/kmem
  286. X.SH SEE ALSO
  287. Xps(C), vmstat(C)
  288. X.SH BUGS
  289. XSome command line options are restricted to the root user for security
  290. Xreasons.
  291. X.SH AUTHOR
  292. XChip Rosenthal
  293. X.br
  294. XUnicom Systems Development, Inc.
  295. X.br
  296. X<chip@chinacat.unicom.com>
  297. END_OF_FILE_freemem.1
  298.     size="`wc -c < freemem.1`"
  299.     if test 1249 -ne "$size" ; then
  300.     echo "freemem.1: extraction error - got $size chars"
  301.     fi
  302. fi
  303. echo "done - 3 files extracted"
  304. exit 0
  305. -- 
  306. Chip Rosenthal  512-482-8260  |  Lotus 1-2-3 for UNIX...it's a product
  307. Unicom Systems Development    |  you don't have to support.
  308. <chip@chinacat.Unicom.COM>    |    - recent Lotus 1-2-3 advert
  309.