ioctl - Gerät steuern
Standard-C-Bibliothek (
libc,
-lc)
#include <sys/ioctl.h>
int ioctl(int dd, unsigned long Aufruf, …);
Der Systemaufruf
ioctl() manipuliert die zugrundeliegenden
Geräteparameter von Spezialdateien. Im Besonderen können viele
Betriebscharakteristika von zeichenorientierten Spezialdateien (z. B.
Terminals) durch
ioctl-Aufrufe gesteuert werden. Das Argument
dd
muss ein geöffneter Dateideskriptor sein.
Das zweite Argument ist ein geräteabhängiger Aufrufkode. Das
dritte Argument ist ein typloser Zeiger auf Speicher. Er ist traditionell
char * argp (aus einer Zeit bevor
void * gültiges
C war) und wird für diese Diskussion so genannt.
In einem
ioctl()-
Aufruf ist kodiert, ob das Argument ein
in- oder
out-Parameter ist sowie die Größe des
Argumentes
argp in Byte. Makros und Definitionen, die in der
Spezifikation eines
ioctl()-
Aufrufs benutzt werden, befinden
sich in der Datei
<sys/ioctl.h>. Siehe ANMERKUNGEN.
Üblicherweise wird im Erfolgsfall Null zurückgegeben. Ein paar
ioctl()-Aufrufe benutzen den Rückgabewert als Ausgabeparameter
und geben bei Erfolg einen nicht negativen Wert zurück. Bei einem
Fehler wird -1 zurückgegeben und
errno gesetzt, um den Fehler
anzuzeigen.
- EBADF
-
dd ist kein zulässiger Dateideskriptor.
- EFAULT
-
argp referenziert einen Speicherbereich, auf den
nicht zugegriffen werden kann.
- EINVAL
-
Aufruf oder argp ist nicht
gültig.
- ENOTTY
-
dd ist nicht mit einem zeichenorientierten
Spezialgerät verbunden.
- ENOTTY
- Der angegebene Aufruf passt nicht zur Art des Objekts, auf
die sich der Dateideskriptor dd bezieht.
Kein einzelner Standard. Argumente, Rückgabewerte und Semantik von
variieren je nach angefragtem Gerätetreiber (der Aufruf
wird als ein Allheilmittel für alle Operationen benutzt, die nicht
sauber in das UNIX-Stream-E/A-Modell passen).
Der Systemaufruf
ioctl erschien in Version 7 von AT&T UNIX.
Um diesen Aufruf zu benutzen, wird ein offener Dateideskriptor benötigt.
Der Aufruf von
open(2) hat oft unerwünschte Nebeneffekte, die
unter Linux durch Angabe des Schalters
O_NONBLOCK vermieden werden
können.
Ioctl-Befehle sind 32-Bit-Konstanten. Im Prinzip sind diese Konstanten
vollkommen willkürlich, aber es gibt Bestrebungen, etwas Struktur zu
etablieren.
In der alten Linux-Situation waren dies hauptsächlich 16-Bit-Konstanten,
wobei das letzte Byte eine Seriennummer war und das/die
vorhergehende(n)
Byte(s) den Typ des Treibers anzeigten. Manchmal wurde die Major-Nummer
verwendet: 0x03 für die
HDIO_*-Ioctls, 0x06 für die
LP*-Ioctls. Und manchmal wurden ein oder mehrere ASCII-Buchstaben
verwandt. Beispielsweise hat
TCGETS den Wert 0x00005401, mit 0x54 =
»T« zur Angabe des Terminal-Treibers und
CYGETTIMEOUT hat
den Wert 0x00435906, mit 0x43 0x59 = »C« »Y« zur
Angabe des »cyclades«-Treibers.
Später (0.98p5) wurden weitere Informationen in die Nummer eingebaut. Es
gibt zwei Richtungs-Bits (00: keine, 01: schreiben, 10: lesen, 11:
lesen/schreiben), gefolgt von 14 Größen-Bits (die die
Größe des Arguments angeben), gefolgt von einem 8-Bit-Typ (die
die Ioctls in Gruppen für einen gemeinsamen Zweck oder gemeinsamen
Treiber sammeln) und einer 8-Bit-Seriennummer.
Die Makros, die diese Struktur beschreiben, befinden sich in
<asm/ioctl.h> und sind
_IO(type,nr) und
{_IOR,_IOW,_IOWR}(type,nr,size). Sie verwenden
sizeof(size), so
dass die Größe hier eine Fehlbenennung ist: dieses dritte
Argument ist ein Datentyp.
Beachten Sie, dass die Größen-Bits sehr unzuverlässig sind:
in vielen Fällen stimmen sie nicht, entweder aufgrund fehlerhafter
Makros, die
sizeof(sizeof(struct)) verwenden oder aufgrund historisch
geerbter Werte.
Daher scheint es, dass die neue Struktur nur Nachteile ergab: sie hilft nicht
beim Überprüfen, verursacht aber variierende Werte für
die verschiedenen Architekturen.
execve(2),
fcntl(2),
ioctl_console(2),
ioctl_fat(2),
ioctl_ficlone(2),
ioctl_ficlonerange(2),
ioctl_fideduperange(2),
ioctl_fslabel(2),
ioctl_getfsmap(2),
ioctl_iflags(2),
ioctl_ns(2),
ioctl_tty(2),
ioctl_userfaultfd(2),
open(2),
sd(4),
tty(4)
Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Schulze
<
[email protected]>, Michael Piefel <
[email protected]>, Patrick
Rother <
[email protected]>, Chris Leick <
[email protected]>, Mario
Blättermann <
[email protected]>, Dr. Tobias Quathamer
<
[email protected]> und Helge Kreutzmann <
[email protected]>
erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die
GNU
General Public License Version 3 oder neuer bezüglich der
Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken
Sie bitte eine E-Mail an die
Mailingliste
der Übersetzer