heartbeat.c
上传用户:wudi5211
上传日期:2010-01-21
资源大小:607k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

C/C++

  1. /*
  2.  * heatbeat.c -- flash NumLock in an hearthbeat fashion
  3.  */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <unistd.h>
  7. #include <string.h>
  8. #include <ctype.h>
  9. #include <errno.h>
  10. #include <sys/types.h>
  11. #include <sys/stat.h>
  12. #include <fcntl.h>
  13. #include <sys/ioctl.h>
  14. #include <linux/kd.h>
  15. int main(int argc, char **argv)
  16. {
  17.     char led;
  18.     int chosenled = 1;
  19.     char hearth[]={1,0,1,1,0,0,0,0,0,0,0,0,0};
  20.     int udelay = 100000;
  21.     int load = 0;
  22.     char *prgname = argv[0];
  23.     FILE *f;
  24.     if (argc > 1 && isdigit(argv[1][0])) { /* the time delay */
  25.         udelay = 1000 * atoi(argv[1]);
  26.         if (udelay < 1000)
  27.             fprintf(stderr, "%s: delay too shortn", prgname);
  28.         else {
  29.             argv++; argc--;
  30.         }
  31.     }
  32.     nice(-20); /* in case is succeeds... */
  33.     udelay *= 100; /* prepare for a later division */
  34.     if (argc > 1 && strlen(argv[1]) == 1) {
  35.         argv++, argc--;
  36.         if (tolower(argv[0][0]) == 's') chosenled = 1; /* scroll lock */
  37.         else 
  38.             if (tolower(argv[0][0]) == 'n') chosenled = 2; /* num lock */
  39.         else
  40.             if (tolower(argv[0][0]) == 'c') chosenled = 4; /* caps lock */
  41.         else {
  42.             fprintf(stderr, "%s: unknown led '%s'n", prgname, argv[1]);
  43.             argc++;
  44.         }
  45.     }
  46.     if (argc>1) {
  47.         fprintf(stderr, "%s: usage "%s [delay ms] [ n | c | s ]"n",
  48.                 prgname, prgname);
  49.         exit(1);
  50.     }
  51.    
  52.     
  53.     /* ok, now do your loop */
  54.     for (;;) {
  55.         int consolefd=open("/dev/tty0",O_RDONLY);
  56.         int i;
  57.         f=fopen("/proc/loadavg", "r");
  58.         if (f) {
  59.             fscanf(f, "%d.%d", &load, &i);
  60.             fclose(f);
  61.         } else {
  62.             load = i = 0;
  63.         }
  64.         load = 100 + load * 100 + i;
  65.         for (i=0; i < sizeof(hearth)/sizeof(hearth[0]); i++) {
  66.             if (ioctl(consolefd, KDGETLED, &led)
  67.                 || ioctl(consolefd, KDSETLED,
  68.                          (led & ~chosenled) | chosenled * hearth[i])) {
  69.                 fprintf(stderr, "%s: ioctl(): %sn", prgname, strerror(errno));
  70.                 exit(2);
  71.             }
  72.             usleep(udelay/load);
  73.         }
  74.         close(consolefd);
  75.     }
  76.     exit(0); /* never happen */
  77. }
  78.