ioctl(2) System Calls Manual ioctl(2) BEZEICHNUNG ioctl - Gerat steuern BIBLIOTHEK Standard-C-Bibliothek (libc, -lc) UBERSICHT #include int ioctl(int fd, unsigned long Aufruf, ); /* Glibc, BSD */ int ioctl(int fd, int Aufruf, ); /* Musl, andere UNIX */ BESCHREIBUNG Der Systemaufruf ioctl() manipuliert die zugrundeliegenden Gerateparameter von Spezialdateien. Im Besonderen konnen viele Betriebscharakteristika von zeichenorientierten Spezialdateien (z. B. Terminals) durch ioctl-Aufrufe gesteuert werden. Das Argument dd muss ein geoffneter Dateideskriptor sein. Das zweite Argument ist ein gerateabhangiger Aufrufkode. Das dritte Argument ist ein typloser Zeiger auf Speicher. Er ist traditionell char *argp (aus einer Zeit bevor void * gultiges C war) und wird fur diese Diskussion so genannt. In einem ioctl()-Aufruf ist kodiert, ob das Argument ein in- oder out-Parameter ist sowie die Grosse des Argumentes argp in Byte. Makros und Definitionen, die in der Spezifikation eines ioctl()-Aufrufs benutzt werden, befinden sich in der Datei . Siehe ANMERKUNGEN. RUCKGABEWERT Ublicherweise wird im Erfolgsfall Null zuruckgegeben. Ein paar ioctl()-Aufrufe benutzen den Ruckgabewert als Ausgabeparameter und geben bei Erfolg einen nicht negativen Wert zuruck. Bei einem Fehler wird -1 zuruckgegeben und errno gesetzt, um den Fehler anzuzeigen. FEHLER EBADF dd ist kein zulassiger Dateideskriptor. EFAULT argp referenziert einen Speicherbereich, auf den nicht zugegriffen werden kann. EINVAL Aufruf oder argp ist nicht gultig. ENOTTY dd ist nicht mit einem zeichenorientierten Spezialgerat verbunden. ENOTTY Der angegebene Aufruf passt nicht zur Art des Objekts, auf die sich der Dateideskriptor dd bezieht. VERSIONEN Argumente, Ruckgabewerte und Semantik von ioctl(2) variieren je nach angefragtem Geratetreiber (der Aufruf wird als ein Allheilmittel fur 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 fildes, int Aufruf, struct sgttyb *argp); (wobei struct sgttyb historisch von stty(2) und gtty(2) verwandt wurde und vom Anfragetyp her polymorph ist (wie void * das ware, wenn es verfugbar gewesen ware)). SysIII dokumentiert arg ganz ohne Typ. 4.3BSD hat ioctl(int d, unsigned long Aufruf, char *argp); (mit char *, ahnlich wie fur void *). SysVr4 hat int ioctl(int fildes, int Aufruf, /* arg */); ANMERKUNGEN Um diesen Aufruf zu benutzen, wird ein offener Dateideskriptor benotigt. Der Aufruf von open(2) hat oft unerwunschte Nebeneffekte, die unter Linux durch Angabe des Schalters O_NONBLOCK vermieden werden konnen. Ioctl-Struktur Ioctl-Befehle sind 32-Bit-Konstanten. Im Prinzip sind diese Konstanten vollkommen willkurlich, aber es gibt Bestrebungen, etwas Struktur zu etablieren. In der alten Linux-Situation waren dies hauptsachlich 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 fur die HDIO_*-Ioctls, 0x06 fur 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. Spater (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 Grossen-Bits (die die Grosse des Arguments angeben), gefolgt von einem 8-Bit-Typ (die die Ioctls in Gruppen fur einen gemeinsamen Zweck oder gemeinsamen Treiber sammeln) und einer 8-Bit-Seriennummer. Die Makros, die diese Struktur beschreiben, befinden sich in und sind _IO(type,nr) und {_IOR,_IOW,_IOWR}(type,nr,size). Sie verwenden sizeof(size), so dass die Grosse hier eine Fehlbenennung ist: dieses dritte Argument ist ein Datentyp. Beachten Sie, dass die Grossen-Bits sehr unzuverlassig sind: in vielen Fallen 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 Uberprufen, verursacht aber variierende Werte fur die verschiedenen Architekturen. SIEHE AUCH 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) UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Martin Schulze , Michael Piefel , Patrick Rother , Chris Leick , Mario Blattermann , Dr. Tobias Quathamer und Helge Kreutzmann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.06 31. Oktober 2023 ioctl(2)