Provided by: manpages-de-dev_4.21.0-2_all bug

BEZEICHNUNG

       ioctl_tty - Ioctls für Terminals und serielle Leitungen

BIBLIOTHEK

       Standard-C-Bibliothek (libc, -lc)

ÜBERSICHT

       #include <sys/ioctl.h>
       #include <asm/termbits.h>   /* Definition von struct termios,
                                      struct termios2 und
                                      Bnnn, BOTHER, CBAUD, CLOCAL,
                                      TC*{FLUSH,ON,OFF} und anderen Konstanten */

       int ioctl(int dd, int Bef, …);

BESCHREIBUNG

       Der ioctl(2)-Aufruf für Terminals und serielle Ports akzeptiert viele mögliche Befehlzeilenargumente. Die
       meisten erwarten ein drittes Argument, von verschiedenem Typ, hier argp oder arg genannt.

       Durch   die   Verwendung   von   ioctl   entstehen   nichtportierbare   Programme.   Verwenden   Sie  die
       POSIX-Schnittstelle, wie in termios(3) beschrieben, wann immer möglich.

       Bitte beachten Sie, dass struct termios aus <asm/termbits.h> anders und inkompatibel  zu  struct  termios
       aus <termios.h> ist. Diese Ioctl-Aufrufe benötigen struct termios aus <asm/termbits.h>.

   Terminal-Attribute ermitteln und setzen
       TCGETS Argument: struct termios *argp

              äquivalent zu tcgetattr(dd, argp)

              Einstellungen der aktuellen seriellen Schnittstelle ermitteln

       TCSETS Argument: const struct termios *argp

              äquivalent zu tcsetattr(dd, TCSANOW, argp)

              Einstellungen der aktuellen seriellen Schnittstelle setzen

       TCSETSW
              Argument: const struct termios *argp

              äquivalent zu tcsetattr(dd, TCSADRAIN, argp)

              Erlaubt dem Ausgabepuffer, leerzulaufen, und setzt die aktuellen Einstellungen serieller Ports.

       TCSETSF
              Argument: const struct termios *argp

              äquivalent zu tcsetattr(dd, TCSAFLUSH, argp)

              Erlaubt  dem  Ausgabepuffer,  leerzulaufen,  verwirft  wartende  Eingaben  und setzt die aktuellen
              Einstellungen serieller Ports.

       Die folgenden vier, in Linux 2.6.20  hinzugefügten  Ioctls,  sind  genau  wie  TCGETS,  TCSETS,  TCSETSW,
       TCSETSF,  außer  dass  sie  ein  struct  termios2  *  statt eines struct termios * akzeptieren. Falls das
       Strukturmitglied c_cflag den Schalter BOTHER enthält,  wird  die  Baud-Rate  in  den  Strukturmitgliedern
       c_ispeed  und  c_ospeed  als Ganzzahlwerte gespeichert. Diese Ioctls werden nicht auf allen Architekturen
       unterstützt.
              TCGETS2    struct termios2 *argp
              TCSETS2    const struct termios2 *argp
              TCSETSW2   const struct termios2 *argp
              TCSETSF2   const struct termios2 *argp

       Die folgenden vier Ioctls sind genau wie TCGETS, TCSETS, TCSETSW, TCSETSF,  außer  dass  Sie  ein  struct
       termio * statt eines struct termios * erwarten.
              TCGETA    struct termio *argp
              TCSETA    const struct termio *argp
              TCSETAW   const struct termio *argp
              TCSETAF   const struct termio *argp

   Sperren der Struktur Termios
       Die  Struktur  termios eines Terminals kann gesperrt werden. Die Sperre ist selbst eine Struktur termios,
       bei der von Null verschiedene Bits die gesperrten Werte anzeigen.

       TIOCGLCKTRMIOS
              Argument: struct termios *argp

              Ermittelt den Status der Sperren der Struktur termios des Terminals.

       TIOCSLCKTRMIOS
              Argument: const struct termios *argp

              Setzt den Status der Sperren der Struktur termios des Terminals. Nur Prozesse mit  der  Capability
              CAP_SYS_ADMIN können dies tun.

   Fenstergröße ermitteln und setzen
       Fenstergrößen  werden  im  Kernel  gehalten,  dort  aber  nicht  verwandt  (außer im Falle der virtuellen
       Konsolen, bei denen der Kernel die  Fenstergrößen  aktualisiert,  wenn  sich  die  Größe  der  virtuellen
       Konsolen ändert, beispielsweise durch Laden einer neuen Schriftart).

       TIOCGWINSZ
              Argument: struct winsize *argp

              Fenstergröße ermitteln.

       TIOCSWINSZ
              Argument: const struct winsize *argp

              Fenstergröße setzen.

       Das von diesen Ioctls verwandte Struct ist wie folgt definiert:

           struct winsize {
               unsigned short ws_row;
               unsigned short ws_col;
               unsigned short ws_xpixel;   /* unbenutzt */
               unsigned short ws_ypixel;   /* unbenutzt */
           };

       Wenn sich die Fenstergröße ändert, wird das Signal SIGWINCH an die Vordergrund-Prozessgruppe gesandt.

   Senden einer Unterbrechung
       TCSBRK Argument: int arg

              äquivalent zu tcsendbreak(dd, arg)

              Falls das Terminal asynchrone Datenübertragung verwendet und arg Null ist, wird eine Unterbrechung
              (ein  Strom  von  Null-Bits)  für  0,25-0,5  Sekunden gesandt. Falls das Terminal keine asynchrone
              serielle Datenübertragung verwendet, wird entweder eine Unterbrechung gesandt  oder  die  Funktion
              kehrt ohne Aktion zurück. Falls arg nicht Null ist, ist die Aktion undefiniert.

              (SVr4,  UnixWare,  Solaris  und Linux behandeln tcsendbreak(dd,arg) mit von Null verschiedenem arg
              wie tcdrain(dd). SunOS behandelt arg als Multiplikator und schickt einen Bitstrom, der arg-mal  so
              lang  wie  bei  arg  gleich  Null ist. DG/UX und AIX behandeln arg (wenn von Null verschieden) als
              Zeitintervall in Millisekunden. HP-UX ignoriert arg.)

       TCSBRKP
              Argument: int arg

              Sogenannte »POSIX-Version« von TCSBRK. Sie behandelt von Null verschiedene arg als in Dezisekunden
              gemessenes  Zeitintervall  und  führt  nichts  aus,  falls  der  Treiber   keine   Unterbrechungen
              unterstützt.

       TIOCSBRK
              Argument: void

              Schaltet Unterbrechungen ein, d.h. beginnt das Senden von Null-Bits.

       TIOCCBRK
              Argument: void

              Schaltet Unterbrechungen aus, d.h. beendet das Senden von Null-Bits.

   Software-Flusssteuerung
       TCXONC Argument: int arg

              äquivalent zu tcflow(dd, arg)

              siehe tcflow(3) für die Argumentwerte TCOOFF, TCOON, TCIOFF, TCION

   Pufferzählung und -leerung
       FIONREAD
              Argument: int *argp

              Die Anzahl der Bytes im Eingabepuffer ermitteln.

       TIOCINQ
              Argument: int *argp

              identisch zu FIONREAD

       TIOCOUTQ
              Argument: int *argp

              Die Anzahl der Bytes im Ausgabepuffer ermitteln.

       TCFLSH Argument: int arg

              äquivalent zu tcflush(dd, arg)

              siehe tcflush(3) für die Argumentwerte TCIFLUSH, TCOFLUSH und TCIOFLUSH

       TIOCSERGETLSR
              Argument: int *argp

              Verbindungsstatusregister  ermitteln.  Statusregister  hat  das Bit TIOCSER_TEMT gesetzt, wenn der
              Ausgabepuffer leer ist und auch der Hardware-Sender physisch leer ist.

              Muss nicht von allen seriellen TTY-Treibern unterstützt werden.

              Wenn das Bit TIOCSER_TEMT gesetzt ist, wartet tcdrain(3) nicht und kehrt sofort zurück.

   Eingabe vortäuschen
       TIOCSTI
              Argument: const char *argp

              Das angegebene Byte in die Eingabewarteschlange einfügen.

   Konsolenausgabe umleiten
       TIOCCONS
              Argument: void

              Lenkt die Ausgabe, die an /dev/console oder /dev/tty0 gegangen wäre, an  das  angegebene  Terminal
              um.  Falls  das  ein  Pseudoterminal-Master war, sende es an den Slave. Vor Linux 2.6.10 kann dies
              jeder tun, solange die Ausgabe noch nicht umgeleitet worden war; seit Linux 2.6.10 kann  dies  nur
              ein Prozess mit der Capability CAP_SYS_ADMIN tun. Falls die Ausgabe bereits umgeleitet worden war,
              wird  EBUSY zurückgeliefert. Die Umleitung kann aber beendet werden, indem Ioctl mit einem dd, der
              auf /dev/console oder /dev/tty0 zeigt, verwandt wird.

   Steuerndes Terminal
       TIOCSCTTY
              Argument: int arg

              Macht das angegebene Terminal zum steuernden Terminal des aufrufenden  Prozesses.  Der  aufrufende
              Prozess muss ein Sitzungsleiter sein und darf noch kein steuerndes Terminal haben. Für diesen Fall
              sollte arg als Null angegeben werden.

              Falls dieses Terminal bereits das steuernde Terminal einer anderen Sitzungsgruppe ist, schlägt der
              Ioctl  mit EPERM fehl. Verfügt der Aufrufende allerdings über die Capability CAP_SYS_ADMIN und ist
              arg 1, dann wird das Terminal gestohlen und alle Prozesse, die es als steuerndes Terminal  hatten,
              verlieren es.

       TIOCNOTTY
              Argument: void

              Falls  das  angegebene  Terminal das steuernde Terminal des aufrufenden Prozesses war, wird dieses
              steuernde Terminal aufgegeben. Falls der Prozess der Sitzungsleiter  war,  dann  wird  SIGHUP  und
              SIGCONT  zu  der  Vordergrundprozessgruppe  gesandt  und  alle  Prozesse  in der aktuellen Sitzung
              verlieren ihr steuerndes Terminal.

   Prozessgruppen- und -sitzungskennung
       TIOCGPGRP
              Argument: pid_t *argp

              wenn erfolgreich, äquivalent zu *argp = tcgetpgrp(dd)

              Die Prozessgruppenkennung der Vordergrundprozessgruppe auf diesem Terminal ermitteln.

       TIOCSPGRP
              Argument: const pid_t *argp

              äquivalent zu tcsetpgrp(dd, *argp)

              Die Vordergrundprozessgruppenkennung dieses Terminals setzen.

       TIOCGSID
              Argument: pid_t *argp

              wenn erfolgreich, äquivalent zu *argp = tcgetsid(dd)

              Ermittelt die Sitzungskennung des angegebenen Terminals. Dies schlägt mit dem Fehler ENOTTY  fehl,
              falls das Terminal kein Master-Pseudoterminal und nicht unser steuerndes Terminal ist. Merkwürdig.

   Exklusiver Modus
       TIOCEXCL
              Argument: void

              Setzt  das  Terminal  in  den  exklusiven  Modus.  Es sind keine weiteren open(2)-Aktionen auf dem
              Terminal  erlaubt.  (Sie  schlagen  mit  EBUSY  fehl,  außer  der  Prozess  hat   die   Capability
              CAP_SYS_ADMIN.)

       TIOCGEXCL
              Argument: int *argp

              (Seit  Linux 3.8) Falls sich das Terminal momentan im exklusiven Modus befindet, wird ein von Null
              verschiedener Wert in den durch argp angezeigten  Ort  gelegt;  andernfalls  wird  Null  in  *argp
              gelegt.

       TIOCNXCL
              Argument: void

              exklusiven Modus deaktivieren

   Verbindungsmodus
       TIOCGETD
              Argument: int *argp

              Ermittelt den Verbindungsmodus des Terminals.

       TIOCSETD
              Argument: const int *argp

              Setzt den Verbindungsmodus des Terminals.

   Pseudoterminal-Ioctls
       TIOCPKT
              Argument: const int *argp

              Aktiviert  (wenn *argp von Null verschieden ist) oder deaktiviert den Paketmodus. Kann nur auf die
              Master-Seite eines Pseudoterminals angewandt werden (und liefert andernfalls  ENOTTY  zurück).  Im
              Paketmodus  wird jeder nachfolgende Schreibvorgang ein Paket zurückliefern, das ein einzelnes, von
              Null verschiedenes Steuerbyte oder ein einzelnes Byte, das Zero (»\0«), gefolgt von  den  auf  der
              Slave-Seite  des  Pseudoterminals  geschriebenen  Daten,  enthält.  Falls  das  erste  Byte  nicht
              TIOCPKT_DATA (0) ist, ist es eine ODER-Verknüpfung eines oder mehrerer der folgenden Bits:

              TIOCPKT_FLUSHREAD    Die Lese-Warteschlange für das
                                   Terminal wird geleert.
              TIOCPKT_FLUSHWRITE   Die Schreibe-Warteschlange für das
                                   Terminal wird geleert.
              TIOCPKT_STOP         Ausgabe an das Terminal ist gestoppt.
              TIOCPKT_START        Ausgabe an das Terminal ist neu
                                   gestartet.
              TIOCPKT_DOSTOP       Die Start- und Stoppzeichen sind
                                   ^S/^Q.
              TIOCPKT_NOSTOP       Die Start- und Stoppzeichen sind
                                   nicht ^S/^Q.

              Während der Paketmodus verwandt wird, kann die Anwesenheit von Steuerstatusinformationen, die  von
              der  Master-Seite gelesen werden sollen, für außergewöhnliche Bedingungen durch ein select(2) oder
              ein poll(2) für das Ereignis POLLPRI erkannt werden.

              Dieser Modus wird von rlogin(1) und rlogind(8) benutzt, um eine Anmeldung mit Ausgabe in der Ferne
              und lokaler ^S/^Q-Flusssteuerung zu implementieren.

       TIOCGPKT
              Argument: const int *argp

              (Seit Linux 3.8) Liefert die aktuelle Paketmoduseinstellung in der Ganzzahl, auf die  argp  zeigt,
              zurück.

       TIOCSPTLCK
              Argument: int *argp

              Setzt  (falls  *argp von Null verschieden ist) oder entfernt (falls *argp Null ist) die Sperre auf
              dem Pseudoterminal-Slave-Gerät. (Siehe auch unlockpt(3).)

       TIOCGPTLCK
              Argument: int *argp

              (Seit Linux 3.8) Legt den aktuellen Sperrstatus des Pseudoterminal-Slave-Geräts in den durch  argp
              verwiesenen Ort.

       TIOCGPTPEER
              Argument: int Schalter

              (Seit  Linux  4.13)  Ist ein Dateideskriptor in dd gegeben, der sich auf ein Pseudoterminal-Master
              bezieht, wird dieser (mit  den  angegebenen  open(2)-artigen  Schalter)  geöffnet  und  ein  neuer
              Datei-Deskriptor, der sich auf ein Peer-Pseudoterminal-Slave-Gerät bezieht, zurückgeliefert. Diese
              Aktion  kann  unabhängig  davon  durchgeführt  werden,  ob der Pfadname des Slave-Gerätes über den
              Einhängenamensraum des aufrufenden Prozesses zugreifbar ist.

              Sicherheitsbewusste Anwendungen, die mit Namensräumen interagieren, könnten diese  Aktionen  statt
              open(2)  mit  von  ptsname(3)  zurückgelieferten Pfadnamen und ähnliche Bibliotheksfunktionen, die
              unsichere APIs haben, benutzen. (Beispielsweise kann es in einigen Fällen bei der  Verwendung  von
              ptsname(3) mit einem Pfadnamen, bei dem ein Devpts-Dateisystem in einem anderen Einhängenamensraum
              eingehängt wurde, zur Verwirrung kommen.)

       Die BSD-Ioctls TIOCSTOP, TIOCSTART, TIOCUCNTL und TIOCREMOTE wurden unter Linux nicht implementiert.

   Modem-Steuerung
       TIOCMGET
              Argument: int *argp

              Den Status der Modem-Bits ermitteln.

       TIOCMSET
              Argument: const int *argp

              Den Status der Modem-Bits setzen.

       TIOCMBIC
              Argument: const int *argp

              Die angegebenen Modem-Bits zurücksetzen.

       TIOCMBIS
              Argument: const int *argp

              Die angegebenen Modem-Bits setzen.

       Die folgenden Bits werden von den obigen Ioctls verwandt:

       TIOCM_LE    DSR (Datensatz bereit/Leitung aktiv)
       TIOCM_DTR   DTR (Datenterminal bereit)
       TIOCM_RTS   RTS (Bitte um Senden)
       TIOCM_ST    Sekundärer TXD (Übertragung)
       TIOCM_SR    Sekundärer RXD (Empfang)
       TIOCM_CTS   CTS (klar zum Senden)
       TIOCM_CAR   DCD (Datenträger-Erkennung)
       TIOCM_CD    siehe TIOCM_CAR
       TIOCM_RNG   RNG (Läuten)
       TIOCM_RI    siehe TIOCM_RNG
       TIOCM_DSR   DSR (Datensatz bereit)

       TIOCMIWAIT
              Argument: int arg

              Wartet  auf die Änderung eines der 4 Modem-Bits (DCD, RI, DSR, CTS). Die Bits von Interesse werden
              als Bitmaske in arg angegeben, indem jedes  der  Bit-Werte  (TIOCM_RNG,  TIOCM_DSR,  TIOCM_CD  und
              TIOCM_CTS)  mit  ODER  verknüpft wird. Der Aufrufende sollte TIOCGICOUNT verwenden, um zu schauen,
              welches Bit sich geändert hat.

       TIOCGICOUNT
              Argument: struct serial_icounter_struct *argp

              Ermittelt die Anzahl der Interrupts der seriellen Eingabeleitung (DCD, RI, DSR, CTS).  Die  Anzahl
              wird in die durch argp verwiesene Struktur serial_icounter_struct geschrieben.

              Hinweis:  Sowohl  1->0-  als  auch  0->1-Übergänge  werden  gezählt,  außer  für  RI,  bei dem nur
              0->1-Übergänge gezählt werden.

   Eine Leitung als lokal kennzeichnen
       TIOCGSOFTCAR
              Argument: int *argp

              (»Get software carrier flag«) Ermittelt den Status  des  Schalters  CLOCAL  im  Feld  c_cflag  der
              Struktur termios.

       TIOCSSOFTCAR
              Argument: const int *argp

              (»Set  software  carrier  flag«) Setzt den Schalter CLOCAL in der Struktur termios, wenn *argp von
              Null verschieden ist, und bereinigt ihn andernfalls.

       Falls der Schalter CLOCAL für eine Leitung ausgeschaltet  ist,  dann  ist  das  Hardware-Trägererkennung-
       (DCD-)Signal   bedeutend,  und  ein  open(2)  des  entsprechenden  Terminals  wird  blockieren,  bis  DCD
       festgestellt wurde, und die Leitung verhält sich so, als ob  DCD  immer  festgestellt  worden  wäre.  Der
       Software-Träger-Schalter  wird  normalerweise  für  lokale Geräte eingeschaltet und ist für Leitungen mit
       Modems ausgeschaltet.

   Linux-spezifisch
       Für den TIOCLINUX-Ioctl, siehe ioctl_console(2).

   Kernel-Fehlersuche
       #include <linux/tty.h>

       TIOCTTYGSTRUCT
              Argument: struct tty_struct *argp

              Die dd entsprechende tty_struct ermitteln. Dieser Befehl wurde in Linux 2.5.67 entfernt.

RÜCKGABEWERT

       Der Systemaufruf ioctl(2) liefert im Erfolgsfall 0 zurück. Bei einem Fehler  wird  -1  zurückgegeben  und
       errno gesetzt, um den Fehler anzuzeigen.

FEHLER

       EINVAL Ungültiger Befehlsparameter.

       ENOIOCTLCMD
              Unbekannter Befehl.

       ENOTTY Ungeeigneter dd.

       EPERM  Unzureichende Berechtigung.

BEISPIELE

       Die Bedingungen von DTR auf dem seriellen Port prüfen.

       #include <fcntl.h>
       #include <stdio.h>
       #include <sys/ioctl.h>
       #include <unistd.h>

       int
       main(void)
       {
           int fd, serial;

           fd = open("/dev/ttyS0", O_RDONLY);
           ioctl(fd, TIOCMGET, &serial);
           if (serial & TIOCM_DTR)
               puts("TIOCM_DTR ist gesetzt");
           else
               puts("TIOCM_DTR ist nicht gesetzt");
           close(fd);
       }

       Baud-Rate auf dem seriellen Port ermitteln oder setzen.

       /* SPDX-License-Identifier: GPL-2.0-or-later */

       #include <asm/termbits.h>
       #include <fcntl.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <sys/ioctl.h>
       #include <unistd.h>

       int
       main(int argc, char *argv[])
       {
       #if !defined BOTHER
           fprintf(stderr, "BOTHER wird nicht unterstützt\n");
           /* Program kann auf TCGETS/TCSETS mit Bnnn-Konstanten zurückfallen */
           exit(EXIT_FAILURE);
       #else
           /* tio-Struktur deklarieren, sein Typ hängt vom unterstützten Ioctl ab */
       # if defined TCGETS2
           struct termios2 tio;
       # else
           struct termios tio;
       # endif
           int fd, rc;

           if (argc != 2 && argc != 3 && argc != 4) {
               fprintf(stderr, "Aufruf: %s Gerät [Ausgabe [Eingabe] ]\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           fd = open(argv[1], O_RDWR | O_NONBLOCK | O_NOCTTY);
           if (fd < 0) {
               perror("open");
               exit(EXIT_FAILURE);
           }

           /* Die aktuellen Einstellungen des seriellen Ports mittels unterstützter Ioctl erhalten */
       # if defined TCGETS2
           rc = ioctl(fd, TCGETS2, &tio);
       # else
           rc = ioctl(fd, TCGETS, &tio);
       # endif
           if (rc) {
               perror("TCGETS");
               close(fd);
               exit(EXIT_FAILURE);
           }

           /* Die Baud-Rate ändern, wenn mehr Argumente bereitgestellt wurden */
           if (argc == 3 || argc == 4) {
               /* Die aktuelle Ausgabe-Baudrate zurücksetzen und einen neuen Wert einfüllen */
               tio.c_cflag &= ~CBAUD;
               tio.c_cflag |= BOTHER;
               tio.c_ospeed = atoi(argv[2]);

               /* Die aktuelle Eingabe-Baudrate zurücksetzen und einen neuen Wert einfüllen */
               tio.c_cflag &= ~(CBAUD << IBSHIFT);
               tio.c_cflag |= BOTHER << IBSHIFT;
               /* Wenn das 4. Argument nicht bereitgestellt wurde, die Ausgabe-Baudrate wiederverwenden */
               tio.c_ispeed = (argc == 4) ? atoi(argv[3]) : atoi(argv[2]);

               /* Neue Einstellungen für seriellen Port mittels unterstützter Ioctl setzen */
       # if defined TCSETS2
               rc = ioctl(fd, TCSETS2, &tio);
       # else
               rc = ioctl(fd, TCSETS, &tio);
       # endif
               if (rc) {
                   perror("TCSETS");
                   close(fd);
                   exit(EXIT_FAILURE);
               }

               /* Und die wirklich konfigurierten neuen Werte erhalten */
       # if defined TCGETS2
               rc = ioctl(fd, TCGETS2, &tio);
       # else
               rc = ioctl(fd, TCGETS, &tio);
       # endif
               if (rc) {
                   perror("TCGETS");
                   close(fd);
                   exit(EXIT_FAILURE);
               }
           }

           close(fd);

           printf("Ausgabe-Baudrate: %u\n", tio.c_ospeed);
           printf("Eingabe-Baudrate: %u\n", tio.c_ispeed);

           exit(EXIT_SUCCESS);
       #endif
       }

SIEHE AUCH

       ldattach(8), ioctl(2), ioctl_console(2), termios(3), pty(7)

ÜBERSETZUNG

       Die deutsche Übersetzung dieser Handbuchseite wurde von Helge Kreutzmann <debian@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  die
       Mailingliste der Übersetzer.

Linux man-pages 6.03                             5. Februar 2023                                    ioctl_tty(2)