Lauflicht mit NumLock, CapsLock, ScrollLock

Nachdem ich das Programm tleds gefunden habe, das über die Tastaturleuchtdioden den Traffic über ein Netzwerkdevice wie z.B. eth0 oder ippp0 anzeigt, hab ich keine Ruhe gegeben, bis ich rausgefunden habe, wie man diese Leuchtdioden anspricht. Also hab ich den Quelltext gewälzt bis ich ihn einigermaßem verstanden hab. (Kann ich übrigens nur empfehlen, man lernt viel dabei!).
Dann hab ich ein kleines Lauflichprogramm geschrieben, nix sinniges, ich will es nur niemandem vorenthalten wie's geht:

#include < paths.h >
#include < ctype.h > 
#include < stdlib.h >
#include < time.h >
#include < signal.h >
#include < sys/time.h >
#include < sys/types.h >
#include < sys/stat.h >
#include < fcntl.h >
#include < sys/ioctl.h >
#include < linux/kd.h >
#include < linux/vt.h >
#include < assert.h >
#include < stdio.h >
#include < linux/cdrom.h >
#include < sys/ioctl.h >
#include < stdlib.h >
#include < signal.h >
#include < unistd.h >

#define KD "/dev/console"   
 

int main(void){

long int i;
static int kd=0;

if ( -1==(kd=open(KD, O_RDONLY)))
	printf("\nFehler beim Oeffnen des Geraets!\n");
	else{
		printf("Bitte Geschwindigkeit eingeben (z.B.300000): \n");
		scanf("%i",&i);
		for(;;){   
        	ioctl(kd, KDSETLED, 1);
        	usleep(i);
        	ioctl(kd, KDSETLED, 4);
        	usleep(i);
        	ioctl(kd, KDSETLED, 2);
        	usleep(i);
        
//    sleep(1);
      }
}

close(kd);
return 0;
}
  
Es ist vermutlich nicht nötig alle diese #includes einzubinden, ich hab sie aber einfach 1:1 aus dem Sourcecode von tleds übernommen.
mit open(KD, O_RDONLY) bereiten wir das device vor, das wir benutzen wollen. (Die Tastatur). open gibt dann einen Filedeskriptor zurück, der in ioctl benötigt wird. ioctl ist die Schnittstelle zu Hardwareeinstellungen.
An Parametern erwartet sie einen Fildeskriptor (s.o.), eine Variable und eine Int-Variable (Hier KDSETLED) der sich auf die jeweilige Variable bezieht.
Die Einstellungen sind in der Manpage ioctl_list dokumentiert, man sollte auch man ioctl nicht ausser Acht lassen. Das wars eigentlich schon. KDSETLED setzt mit einer Zahl (3-Bit-Zahl) die LED's. Sie werden einfach im Binärsystem hochgezählt, allerdings sind die NumLock und die Capslock Taste zu vertauschen, damit das System stimmt. (daher auch die idiotische Zählweise 1,4,2 statt 1,2,4)
Übrigens: Hier werden NUR die LED's an und ausgeschaltet, nicht die Tasten. (Sprich wenn NumLock an war, bleibt es an, auch wenn das Licht was anderes sagt. Auch die Funktion ist nicht beeinträchtigt. Man siehts halt nicht mehr, dafür ein nettes Lauflicht ;-)
 

Übrigens: Wie bei der Ansteuerung des CDROM-Laufwerkes auch zu sehen ist (oder noch zu sehen sein wird, ist halt noch nicht fertig), werden unter Linux Geräte ziemlich simpel angesprochen:
Unter Linux ist vereinfacht ausgedrückt alles eine Datei, auch Hardware. Diese Gerätedateien liegen in /dev. (z.B. /dev/cdrom1 ist ein solches).
Diese kann ich mittels ioctl programmieren. (Siehe man ioctl für die Parameter die programmiert werden können). Vor der Programmierung wird das Gerät wie eine normale Datei mit open geöffnet und hinterher wieder mit close geschlossen. (Siehe man open, man close).

Autor: Baitronic