ioctl(2)

BEZEICHNUNG
ioctl - Gerät steuern

BIBLIOTHEK
Standard-C-Bibliothek (libc, -lc)

ÜBERSICHT
#include <sys/ioctl.h>

int ioctl(int dd, unsigned long Aktion, …);  /* Glibc, BSD */
int ioctl(int dd, int Aktion, …);            /* Musl, andere UNIX */

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-Aktionen gesteuert werden. Das Argument dd muss ein geöffneter Dateideskriptor sein.

Das zweite Argument ist ein geräteabhängiger Aktionscode. 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()-Aktion 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()-Aktion benutzt werden, befinden sich in der Datei <sys/ioctl.h>. Siehe ANMERKUNGEN.

RÜCKGABEWERT
Üblicherweise wird im Erfolgsfall Null zurückgegeben. Ein paar ioctl()-Aktionen benutzen den Rückgabewert als Ausgabeparameter und geben bei Erfolg einen nichtnegativen Wert zurück. Bei einem Fehler wird -1 zurückgegeben und errno gesetzt, um den Fehler anzuzeigen.

FEHLER

EBADF
    dd ist kein zulässiger Dateideskriptor.

EFAULT
    argp referenziert einen Speicherbereich, auf den nicht zugegriffen werden kann.

EINVAL
    Aktion oder argp ist nicht gültig.

ENOTTY
    dd ist nicht mit einem zeichenorientierten Spezialgerät verbunden.

ENOTTY
    Die angegebene Aktion passt nicht zur Art des Objekts, auf die sich der Dateideskriptor dd bezieht.

VERSIONEN
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).

STANDARDS
Keine.

GESCHICHTE
Version 7 AT&T UNIX hat
ioctl(int dd, int Aktion, struct sgttyb *argp);
(wobei struct sgttyb historisch von stty(2) und gtty(2) verwandt wurde und vom Aktionstyp her polymorph ist (wie void * das wäre, wenn es verfügbar gewesen wäre)).

SysIII dokumentiert arg ganz ohne Typ.

4.3BSD hat
ioctl(int d, unsigned long Aktion, char *argp);
(mit char *, ähnlich wie für void *).

SysVr4 hat
int ioctl(int dd, int Aktion, …  /* arg */);

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-Aktion-Werte 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.

SIEHE AUCH
execve(2), fcntl(2), ioctl_console(2), ioctl_fat(2), ioctl_fs(2), ioctl_fsmap(2), ioctl_nsfs(2), ioctl_tty(2), ioctl_userfaultfd(2), ioctl_eventpoll(2), open(2), sd(4), tty(4)

ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Schulze <joey@infodrom.org>, Michael Piefel <piefel@debian.org>, Patrick Rother <krd@gulu.net>, Chris Leick <c.leick@vollbio.de>, Mario Blättermann <mario.blaettermann@gmail.com>, Dr. Tobias Quathamer <toddy@debian.org> und Helge Kreutzmann <debian@helgefjell.de> erstellt.

Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 (https://www.gnu.org/licenses/gpl-3.0.html) 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 (debian-l10n-german@lists.debian.org).