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

  1. /*
  2.  * tload.c    - terminal version of xload
  3.  *
  4.  * Options:
  5.  *    -s initial scaling exponent (default = 6)
  6.  *    -d delay
  7.  *
  8.  * Copyright (c) 1992 Branko Lankester
  9.  * /proc changes by David Engel (david@ods.com)
  10.  * Made a little more efficient by Michael K. Johnson (johnsonm@sunsite.unc.edu)
  11.  */
  12.  
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <termios.h>
  16. #include <fcntl.h>
  17. #include <signal.h>
  18. #include <string.h>
  19. #include <setjmp.h>
  20. #include <unistd.h>
  21. #include <sys/ioctl.h>
  22. #include "sysinfo.h"
  23.  
  24. char *screen;
  25.  
  26. int nrows = 25;
  27. int ncols = 80;
  28. int scr_size;
  29. int interv = 1;
  30. int fd=1;
  31. int dly=5;
  32. jmp_buf jb;
  33.  
  34. extern int optind;
  35. extern char *optarg;
  36.  
  37. void alrm(int n)
  38. {
  39.     signal(SIGALRM, alrm);
  40.     alarm(dly);
  41. }
  42.  
  43. void setsize(int i)
  44. {
  45.     struct winsize win;
  46.  
  47.     signal(SIGWINCH, setsize);
  48.     if (ioctl(fd, TIOCGWINSZ, &win) != -1) {
  49.     if (win.ws_col > 0)
  50.         ncols = win.ws_col;
  51.     if (win.ws_row > 0)
  52.         nrows = win.ws_row;
  53.     }
  54.     scr_size = nrows * ncols;
  55.     if (screen == NULL)
  56.         screen = (char *) malloc(scr_size);
  57.     else
  58.         screen = (char *) realloc(screen, scr_size);
  59.  
  60.     if (screen == NULL) {
  61.     perror("");
  62.     exit(1);
  63.     }
  64.     memset(screen, ' ', scr_size-1);
  65.     *(screen + scr_size - 2) = '\0';
  66.     if (i)
  67.     longjmp(jb, 0);
  68. }
  69.  
  70. int main(int argc, char **argv)
  71. {
  72.     int lines, row, col=0;
  73.     int i, opt;
  74.     double av[3];
  75.     static double max_scale, scale_fact;
  76.     char *scale_arg = NULL;
  77.  
  78.     while ((opt = getopt(argc, argv, "s:d:")) != -1)
  79.     switch (opt) {
  80.         case 's': scale_arg = optarg; break;
  81.         case 'd': dly = atoi(optarg); break;
  82.         default:
  83.         printf("usage: tload [-d delay] [-s scale] [tty]\n");
  84.         exit(1);
  85.     }
  86.  
  87.     if (argc > optind) {
  88.     if ((fd = open(argv[optind], 1)) == -1) {
  89.         perror(argv[optind]);
  90.         exit(1);
  91.     }
  92.     }
  93.  
  94.     setsize(0);
  95.  
  96.     if (scale_arg)
  97.       max_scale = atof(scale_arg);
  98.     else
  99.       max_scale = nrows;
  100.  
  101.     scale_fact = max_scale;
  102.  
  103.     setjmp(jb);
  104.     col = 0;
  105.     alrm(0);
  106.  
  107.     while (1) {
  108.  
  109.      if (scale_fact < max_scale)
  110.         scale_fact *= 2.0; /* help it drift back up. */
  111.  
  112.     loadavg(&av[0], &av[1], &av[2]);
  113.  
  114.     repeat:
  115.     lines = av[0] * scale_fact;
  116.     row = nrows-1;
  117.  
  118.     while (--lines >= 0) {
  119.         *(screen + row * ncols + col) = '*';
  120.         if (--row < 0) {
  121.         scale_fact /= 2.0;
  122.         goto repeat;
  123.         }
  124.     }
  125.     while (row >= 0)
  126.         *(screen + row-- * ncols + col) = ' ';
  127.  
  128.     for (i = 1; ; ++i) {
  129.         char *p;
  130.         row = nrows - (i * scale_fact);
  131.         if (row < 0)
  132.         break;
  133.         if (*(p = screen + row * ncols + col) == ' ')
  134.         *p = '-';
  135.         else
  136.         *p = '=';
  137.     }
  138.  
  139.     if (++col == ncols) {
  140.         --col;
  141.         memmove(screen, screen + 1, scr_size-1);
  142.  
  143.         for(row = nrows-2; row >= 0; --row)
  144.         *(screen + row * ncols + col) = ' ';
  145.     }
  146.     i = sprintf(screen, " %.2f, %.2f, %.2f",
  147.         av[0], av[1], av[2]);
  148.     if (i>0)
  149.         screen[i] = ' ';
  150.  
  151.     write(fd, "\033[H", 3);
  152.     write(fd, screen, scr_size - 1);
  153.     pause();
  154.     }
  155. }
  156.