5.3 Zugriff auf die Gerätedateien
Wie schon erwähnt, erfolgt der Zugriff auf Gerätedateien (dank Integration im Dateisystem) über die gewöhnlichen Datei-E/A-Funktionen. Natürlich lässt sich dies auch via Shell mit einer Dateiumleitung erledigen. Wollen Sie z. B. einen Text an die Gerätedatei des Druckers senden, so gehen Sie einfach folgendermaßen vor (entsprechende Zugriffsrechte vorausgesetzt):
$ cat textdatei.txt > /dev/lp0
Selbiges in einem C-Programm angewandt, sieht so aus:
int fd;
fd = open("/dev/lp0", O_WRONLY);
if(fd >= 0)
write(fd, buf, buf_size);
close(fd);
Zum Öffnen und Schließen einer Gerätedatei werden somit open() und close() und zum Lesen und Schreiben die Funktionen read() und write() verwendet.
Mit der Möglichkeit, bestimmte Gerätedateien zu öffnen und schreibend bzw. lesend darauf zuzugreifen, können Sie nur einen Bruchteil dessen machen, wozu der Treiber imstande ist. Denn neben dem Schreiben und Lesen ist es auch möglich, ein Gerät in seiner spezifischen Art zu steuern. Dies können Sie mit dem Funktionsaufruf ioctl() (Input-Output-Control) erledigen. Erst damit können Sie den Treiber unter Linux direkt ansprechen. Hierfür müssen Sie allerdings den entsprechenden Befehlssatz für den entsprechenden Treiber kennen. Zuerst die Syntax zu ioctl():
#include <sys/ioctl.h>
int ioctl(int fd, int request ... );
Als ersten Parameter geben Sie den geöffneten Filedeskriptor an, mit dem Sie eine Gerätedatei geöffnet haben, und der zweite Parameter ist der entsprechende Befehl, der natürlich von der Gerätedatei abhängt, die geöffnet wurde. Sie können z. B. nicht für eine Festplatte den Befehl zum Auswerfen einer CD-ROM verwenden (groteskes Beispiel, es macht aber deutlich, worauf ich hinauswill). Im Fehlerfall liefert ioctl() -1, ansonsten bei Erfolg 0 zurück.
Beachten Sie allerdings, dass es sich hier um keinen Standard handelt. Argumente, Rückgabewerte und Semantik von ioctl() variieren je nach dem entsprechenden Gerätetreiber (der Aufruf wird als ein Allheilmittel für alle Operationen benutzt, die nicht sauber in das UNIX-Stream-E/A-Modell passen). Siehe ioctl_list(2) für eine Liste von vielen der bekannten ioctl-Aufrufe. Die Funktion ioctl() erschien in Version 7 von AT&T UNIX.
Die entsprechenden Befehlssätze für eine bestimmte Gerätedatei, um damit den entsprechenden Treiber zu steuern, finden Sie unter man ioctl_list – was allerdings mittlerweile keine vollständige Liste mehr darstellt. Wie Sie diese Befehle anwenden, werde ich Ihnen anhand eines Beispiels mit dem CD-ROM-Laufwerk demonstrieren.
|