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

嵌入式Linux

开发平台:

C/C++

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