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

嵌入式Linux

开发平台:

C/C++

  1. /*
  2.  * heatbeat.c -- flash NumLock in an hearthbeat fashion
  3.  *
  4.  * Copyright (C) 2001 Alessandro Rubini and Jonathan Corbet
  5.  * Copyright (C) 2001 O'Reilly & Associates
  6.  *
  7.  * The source code in this file can be freely used, adapted,
  8.  * and redistributed in source or binary form, so long as an
  9.  * acknowledgment appears in derived source files.  The citation
  10.  * should list that the code comes from the book "Linux Device
  11.  * Drivers" by Alessandro Rubini and Jonathan Corbet, published
  12.  * by O'Reilly & Associates.   No warranty is attached;
  13.  * we cannot take responsibility for errors or fitness for use.
  14.  */
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <unistd.h>
  18. #include <string.h>
  19. #include <ctype.h>
  20. #include <errno.h>
  21. #include <sys/types.h>
  22. #include <sys/stat.h>
  23. #include <fcntl.h>
  24. #include <sys/ioctl.h>
  25. #include <linux/kd.h>
  26. int main(int argc, char **argv)
  27. {
  28.     char led;
  29.     int chosenled = 1;
  30.     char hearth[]={1,0,1,1,0,0,0,0,0,0,0,0,0};
  31.     int udelay = 100000;
  32.     int load = 0;
  33.     char *prgname = argv[0];
  34.     FILE *f;
  35.     if (argc > 1 && isdigit(argv[1][0])) { /* the time delay */
  36.         udelay = 1000 * atoi(argv[1]);
  37.         if (udelay < 1000)
  38.             fprintf(stderr, "%s: delay too shortn", prgname);
  39.         else {
  40.             argv++; argc--;
  41.         }
  42.     }
  43.     nice(-20); /* in case is succeeds... */
  44.     udelay *= 100; /* prepare for a later division */
  45.     if (argc > 1 && strlen(argv[1]) == 1) {
  46.         argv++, argc--;
  47.         if (tolower(argv[0][0]) == 's') chosenled = 1; /* scroll lock */
  48.         else 
  49.             if (tolower(argv[0][0]) == 'n') chosenled = 2; /* num lock */
  50.         else
  51.             if (tolower(argv[0][0]) == 'c') chosenled = 4; /* caps lock */
  52.         else {
  53.             fprintf(stderr, "%s: unknown led '%s'n", prgname, argv[1]);
  54.             argc++;
  55.         }
  56.     }
  57.     if (argc>1) {
  58.         fprintf(stderr, "%s: usage "%s [delay ms] [ n | c | s ]"n",
  59.                 prgname, prgname);
  60.         exit(1);
  61.     }
  62.    
  63.     
  64.     /* ok, now do your loop */
  65.     for (;;) {
  66.         int consolefd=open("/dev/tty0",O_RDONLY);
  67.         int i;
  68.         f=fopen("/proc/loadavg", "r");
  69.         if (f) {
  70.             fscanf(f, "%d.%d", &load, &i);
  71.             fclose(f);
  72.         } else {
  73.             load = i = 0;
  74.         }
  75.         load = 100 + load * 100 + i;
  76.         for (i=0; i < sizeof(hearth)/sizeof(hearth[0]); i++) {
  77.             if (ioctl(consolefd, KDGETLED, &led)
  78.                 || ioctl(consolefd, KDSETLED,
  79.                          (led & ~chosenled) | chosenled * hearth[i])) {
  80.                 fprintf(stderr, "%s: ioctl(): %sn", prgname, strerror(errno));
  81.                 exit(2);
  82.             }
  83.             usleep(udelay/load);
  84.         }
  85.         close(consolefd);
  86.     }
  87.     exit(0); /* never happen */
  88. }
  89.