⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 heartbeat.c

📁 本源码是将述嵌入式LINUX驱动程序例程
💻 C
字号:
/*
 * heatbeat.c -- flash NumLock in an hearthbeat fashion
 *
 * Copyright (C) 2001 Alessandro Rubini and Jonathan Corbet
 * Copyright (C) 2001 O'Reilly & Associates
 *
 * The source code in this file can be freely used, adapted,
 * and redistributed in source or binary form, so long as an
 * acknowledgment appears in derived source files.  The citation
 * should list that the code comes from the book "Linux Device
 * Drivers" by Alessandro Rubini and Jonathan Corbet, published
 * by O'Reilly & Associates.   No warranty is attached;
 * we cannot take responsibility for errors or fitness for use.
 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/kd.h>

int main(int argc, char **argv)
{
    char led;
    int chosenled = 1;
    char hearth[]={1,0,1,1,0,0,0,0,0,0,0,0,0};
    int udelay = 100000;
    int load = 0;
    char *prgname = argv[0];
    FILE *f;

    if (argc > 1 && isdigit(argv[1][0])) { /* the time delay */
        udelay = 1000 * atoi(argv[1]);
        if (udelay < 1000)
            fprintf(stderr, "%s: delay too short\n", prgname);
        else {
            argv++; argc--;
        }
    }

    nice(-20); /* in case is succeeds... */

    udelay *= 100; /* prepare for a later division */

    if (argc > 1 && strlen(argv[1]) == 1) {
        argv++, argc--;
        if (tolower(argv[0][0]) == 's') chosenled = 1; /* scroll lock */
        else 
            if (tolower(argv[0][0]) == 'n') chosenled = 2; /* num lock */
        else
            if (tolower(argv[0][0]) == 'c') chosenled = 4; /* caps lock */
        else {
            fprintf(stderr, "%s: unknown led '%s'\n", prgname, argv[1]);
            argc++;
        }
    }
    if (argc>1) {
        fprintf(stderr, "%s: usage \"%s [delay ms] [ n | c | s ]\"\n",
                prgname, prgname);
        exit(1);
    }

   
    
    /* ok, now do your loop */

    for (;;) {
        int consolefd=open("/dev/tty0",O_RDONLY);

        int i;
        f=fopen("/proc/loadavg", "r");
        if (f) {
            fscanf(f, "%d.%d", &load, &i);
            fclose(f);
        } else {
            load = i = 0;
        }
        load = 100 + load * 100 + i;

        for (i=0; i < sizeof(hearth)/sizeof(hearth[0]); i++) {
            if (ioctl(consolefd, KDGETLED, &led)
                || ioctl(consolefd, KDSETLED,
                         (led & ~chosenled) | chosenled * hearth[i])) {
                fprintf(stderr, "%s: ioctl(): %s\n", prgname, strerror(errno));
                exit(2);
            }
            usleep(udelay/load);
        }
        close(consolefd);
    }
    exit(0); /* never happen */
}
                










⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -