home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 1 / 1865 / lavd.c next >
C/C++ Source or Header  |  1990-12-28  |  2KB  |  91 lines

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/sysinfo.h>
  4. #include <sys/ipc.h>
  5. #include <sys/shm.h>
  6. #include <signal.h>
  7. #include <nlist.h>
  8. #include <fcntl.h>
  9.  
  10. #define INTERVAL    5
  11.  
  12. #define    NSAMPLES (15 /* minutes */ * 60 /* sec/min */ / INTERVAL)
  13.  
  14. int ringload[NSAMPLES];
  15. int ringindex = 0;
  16.  
  17. int id;
  18. float *lav;
  19.  
  20. void
  21. die()
  22. {
  23.     if (lav)
  24.         (void) shmdt(lav);
  25.     if (id)
  26.         (void) shmctl(id, IPC_RMID, (struct shmid_ds *)NULL);
  27.     exit(1);
  28. }
  29.  
  30. struct nlist sym[] = {
  31.     { "sysinfo" },
  32.     { NULL }
  33. };
  34.  
  35. main()
  36. {
  37.     struct sysinfo sinfo;
  38.     int flag = 0, now, last1, last5, last15;
  39.     extern int shmget();
  40.     extern char *shmat();
  41.     extern key_t ftok();
  42.     int kmem;
  43.  
  44.     if(nlist("/unix", sym) < 0) {
  45.         fprintf(stderr, "/unix: no namelist.\n");
  46.         exit(1);
  47.     }
  48.     kmem=open("/dev/kmem", O_RDONLY);
  49.     if(kmem<0) {
  50.         perror("/dev/kmem");
  51.         exit(2);
  52.     }
  53.     if(!fork()) {
  54.         setpgrp();
  55.         if (signal(SIGINT, SIG_IGN) != SIG_IGN)
  56.             (void) signal(SIGINT, die);
  57.         if (signal(SIGHUP, SIG_IGN) != SIG_IGN)
  58.             (void) signal(SIGHUP, die);
  59.         if (signal(SIGTERM, SIG_IGN) != SIG_IGN)
  60.             (void) signal(SIGTERM, die);
  61.         id = shmget(ftok("/dev/kmem", 'lav'), 4 * sizeof (float), 0644|IPC_CREAT);
  62.         lav = (float *)shmat(id, (char *)0, 0);
  63.  
  64.         for (;;) {
  65.             now = ringindex;
  66.             lseek(kmem, (long) sym[0].n_value, 0);
  67.             read(kmem, (char *) &sinfo, sizeof sinfo);
  68.             /*sysmp(MP_SAGET, MPSA_SINFO, &sinfo, sizeof sinfo);*/
  69.             ringload[ringindex++] = sinfo.runque;
  70.             if (!flag) {
  71.                 while (flag < NSAMPLES)
  72.                     ringload[flag++] = sinfo.runque;
  73.                 if (!flag)
  74.                     break;    /* shut up the compiler */
  75.             }
  76.             ringindex %= NSAMPLES;
  77.             last1 = (NSAMPLES + now - 60 / INTERVAL)%NSAMPLES;
  78.             last5 = (NSAMPLES + now - 5*60 / INTERVAL)%NSAMPLES;
  79.             last15 = ringindex;
  80.             lav[0] = (ringload[now] - ringload[last1])/60.0;
  81.             lav[1] = (ringload[now] - ringload[last5])/(5*60.0),
  82.             lav[2] = (ringload[now] - ringload[last15])/(15*60.0);
  83.             lav[3] = (ringload[now] - ringload[(now-1+NSAMPLES)%NSAMPLES])/(float)INTERVAL;
  84.             /* printf("%6.2f %6.2f %6.2f\n", lav[0], lav[1], lav[2]); */
  85.             sleep(INTERVAL);
  86.         }
  87.         /* NOTREACHED */
  88.     }
  89.     exit(0);
  90. }
  91.