Manpages

BEZEICHNUNG

ioctl - Gerät steuern

ÜBERSICHT

#include <sys/ioctl.h>

int ioctl(int fd, unsigned long request, …);

BESCHREIBUNG

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 fd 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.

RÜCKGABEWERT

Ü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 entsprechend gesetzt.

FEHLER

EBADF

fd 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

fd ist nicht mit einem zeichenorientierten Spezialgerät verbunden.

ENOTTY

Der angegebene Aufruf passt nicht zur Art des Objekts, auf die sich der Dateideskriptor fd bezieht.

KONFORM ZU

Kein einzelner Standard. Argumente, Rückgabewerte und Semantik von ioctl(2) 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.

ANMERKUNGEN

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-Struktur
Ioctl-Befehle sind 32-Bit-Konstanten. Im Prinzip sind diese Konstanten komplett beliebig, aber es wurde versucht, eine Struktur in sie zu bauen.

In der alten Linux-Situation waren dies hauptsächlich 16-Bit-Konstanten, wobei das letzte Byte die Seriennummer war und das/die vorherigen Byte(s) einen Typ angaben, der den Treiber anzeigte. Manchmal wurde die Major-Nummer verwandt: 0x03 für die HDIO_*-Ioctls, 0x06 für die LP*-Ioctls. Und manchmal wurden eine oder mehrere ASCII-Buchstaben verwandt. Beispielsweise hat TCGETS den Wert 0x00005401, wobei 0x54 = »T« den Terminaltreiber anzeigt und CYGETTIMEOUT hat den Wert 0x00435906, wobei 0x43 0x59 = »C« »Y« den Cyclades-Treiber anzeigt.

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 sind sie falsch, entweder da fehlerhafte Makros sizeof(sizeof(struct)) verwenden oder aufgrund historisch geerbter Werte.

Daher erscheint es, dass die neue Struktur nur Nachteile ergab: sie hilft nicht beim Überprüfen, führt aber zu wechselnden Werte für die verschiedenen Architekturen.

SIEHE AUCH

execve(2), fcntl(2), ioctl_console(2), ioctl_fat(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)

KOLOPHON

Diese Seite ist Teil der Veröffentlichung 5.07 des Projekts Linux-man-pages. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden sich unter https://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Schulze <joey [AT] infodrom.org>, Michael Piefel <piefel [AT] debian.org>, Patrick Rother <krd [AT] gulu.net>, Chris Leick <c.leick [AT] vollbio.de>, Mario Blättermann <mario.blaettermann [AT] gmail.com>, Dr. Tobias Quathamer <toddy [AT] debian.org> und Helge Kreutzmann <debian [AT] helgefjell.de> 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 <debian-l10n-german [AT] lists.org>.