home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / A / PS / PROCPS-0.000 / PROCPS-0 / procps-0.97 / tload2.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-09-25  |  3.2 KB  |  180 lines

  1. /*
  2.  * tload.c    - terminal version of xload
  3.  *
  4.  * Options:
  5.  *    -s initial scaling exponent (default = 6)
  6.  *    -d delay
  7.  *    -b     background mode: don't update if window in background
  8.  *        Uses less cpu time and the screen saver still works if
  9.  *        the tload console is not the current console.
  10.  *
  11.  *
  12.  * Copyright (c) 1992 Branko Lankester
  13.  */
  14.  
  15. #include <stdio.h>
  16. #include <termios.h>
  17. #include <signal.h>
  18. #include <sys/stat.h>
  19. #include <setjmp.h>
  20.  
  21. #define    NR_CONSOLE    8
  22.  
  23. char *screen;
  24.  
  25. int nrows = 25;
  26. int ncols = 80;
  27. int scr_size;
  28. int interv = 1;
  29. int fd=1;
  30. jmp_buf jb;
  31.  
  32. extern int optind;
  33. extern char *optarg;
  34.  
  35. void
  36. readavg(av)
  37.      long av[3];
  38. {
  39.   FILE *fp;
  40.  
  41.   fp = fopen ("/proc/loadavg", "r");
  42.   if (!fp)
  43.     av[0] = av[1] = av[2] = 0;
  44.   else
  45.     {
  46.       float a[3];
  47.  
  48.       fscanf (fp, "%g %g %g", a, a + 1, a + 2);
  49.       fclose (fp);
  50.       av[0] = a[0] * 2048;
  51.       av[1] = a[1] * 2048;
  52.       av[2] = a[2] * 2048;
  53.     }
  54. }
  55.  
  56. void
  57. alrm(n)
  58. {
  59.     signal(SIGALRM, alrm);
  60.     alarm(1);
  61. }
  62.  
  63. void
  64. setsize(i)
  65. {
  66.     struct winsize win;
  67.  
  68.     signal(SIGWINCH, setsize);
  69.     if (ioctl(fd, TIOCGWINSZ, &win) != -1) {
  70.     if (win.ws_col > 0)
  71.         ncols = win.ws_col;
  72.     if (win.ws_row > 0)
  73.         nrows = win.ws_row;
  74.     }
  75.     scr_size = nrows * ncols;
  76.     if (screen == NULL)
  77.         screen = (char *) malloc(scr_size);
  78.     else
  79.         screen = (char *) realloc(screen, scr_size);
  80.  
  81.     if (screen == NULL) {
  82.     perror("");
  83.     exit(1);
  84.     }
  85.     memset(screen, ' ', scr_size-1);
  86.     *(screen + scr_size - 2) = '\0';
  87.     if (i)
  88.     longjmp(jb, 0);
  89. }
  90.  
  91.  
  92. main(argc, argv)
  93. char **argv;
  94. {
  95.     int row, col=0, i, opt, bgnd_mode = 0;
  96.     int lines, min_scale = 6, scale_shift;
  97.     int delay = 5;
  98.     long av[3];
  99.  
  100.     while ((opt = getopt(argc, argv, "bs:d:")) != -1)
  101.     switch (opt) {
  102.         case 's': min_scale = atoi(optarg); break;
  103.         case 'd': delay = atoi(optarg); break;
  104.         case 'b': bgnd_mode = 1; break;
  105.         default:
  106.         printf("usage: tload [-b] [-d delay] [-s scale] [tty]\n");
  107.         exit(1);
  108.     }
  109.  
  110.     if (argc > optind) {
  111.     if ((fd = open(argv[optind], 1)) == -1) {
  112.         perror(argv[optind]);
  113.         exit(1);
  114.     }
  115.     }
  116.  
  117.     setsize(0);
  118.  
  119.     scale_shift = min_scale;
  120.  
  121.     setjmp(jb);
  122.     col = 0;
  123.     alrm(0);
  124.     while (1) {
  125.     int dly = delay;
  126.  
  127.      if ( scale_shift > min_scale )
  128.         scale_shift--; /* help it drift back down.. */
  129.  
  130.     readavg (av);
  131.     repeat:
  132.     lines = av[0] >> scale_shift;
  133.     row = nrows-1;
  134.  
  135.     while (--lines >= 0) {
  136.         *(screen + row * ncols + col) = '*';
  137.         if (--row < 0) {
  138.         ++scale_shift;
  139.         goto repeat;
  140.         }
  141.     }
  142.     while (row >= 0)
  143.         *(screen + row-- * ncols + col) = ' ';
  144.  
  145.     for (i = 1; ; ++i) {
  146.         char *p;
  147.         row = nrows - (i*2048 >> scale_shift);
  148.         if (row < 0)
  149.         break;
  150.         if (*(p = screen + row * ncols + col) == ' ')
  151.         *p = '-';
  152.         else
  153.         *p = '+';
  154.     }
  155.  
  156.     if (++col == ncols) {
  157.         --col;
  158.         memmove(screen, screen + 1, scr_size-1);
  159.  
  160.         for(row = nrows-2; row >= 0; --row)
  161.         *(screen + row * ncols + col) = ' ';
  162.     }
  163.     for (i=0; i<3; ++i) {
  164.         av[i] *= 100;
  165.         av[i] >>= 11;
  166.     }
  167.     i = sprintf(screen, " %d.%02d, %d.%02d, %d.%02d",
  168.         av[0] / 100, av[0] % 100,
  169.         av[1] / 100, av[1] % 100,
  170.         av[2] / 100, av[2] % 100);
  171.     if (i>0)
  172.         screen[i] = ' ';
  173.  
  174.     write(fd, "\033[H", 3);
  175.     write(fd, screen, scr_size - 1);
  176.     while (--dly >= 0)
  177.         pause();
  178.     }
  179. }
  180.