ioctl_tty(2) System Calls Manual ioctl_tty(2) BEZEICHNUNG ioctl_tty - Ioctls fur Terminals und serielle Leitungen BIBLIOTHEK Standard-C-Bibliothek (libc, -lc) UBERSICHT #include #include /* 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 fur Terminals und serielle Ports akzeptiert viele mogliche 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 moglich. Bitte beachten Sie, dass struct termios aus anders und inkompatibel zu struct termios aus ist. Diese Ioctl-Aufrufe benotigen struct termios aus . Terminal-Attribute ermitteln und setzen TCGETS Argument: struct termios *argp aquivalent zu tcgetattr(dd, argp) Einstellungen der aktuellen seriellen Schnittstelle ermitteln TCSETS Argument: const struct termios *argp aquivalent zu tcsetattr(dd, TCSANOW, argp) Einstellungen der aktuellen seriellen Schnittstelle setzen TCSETSW Argument: const struct termios *argp aquivalent zu tcsetattr(dd, TCSADRAIN, argp) Erlaubt dem Ausgabepuffer, leerzulaufen, und setzt die aktuellen Einstellungen serieller Ports. TCSETSF Argument: const struct termios *argp aquivalent 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 hinzugefugten Ioctls, sind genau wie TCGETS, TCSETS, TCSETSW, TCSETSF, ausser dass sie ein struct termios2 * statt eines struct termios * akzeptieren. Falls das Strukturmitglied c_cflag den Schalter BOTHER enthalt, wird die Baud-Rate in den Strukturmitgliedern c_ispeed und c_ospeed als Ganzzahlwerte gespeichert. Diese Ioctls werden nicht auf allen Architekturen unterstutzt. 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, ausser 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 konnen dies tun. Fenstergrosse ermitteln und setzen Fenstergrossen werden im Kernel gehalten, dort aber nicht verwandt (ausser im Falle der virtuellen Konsolen, bei denen der Kernel die Fenstergrossen aktualisiert, wenn sich die Grosse der virtuellen Konsolen andert, beispielsweise durch Laden einer neuen Schriftart). TIOCGWINSZ Argument: struct winsize *argp Fenstergrosse ermitteln. TIOCSWINSZ Argument: const struct winsize *argp Fenstergrosse 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 Fenstergrosse andert, wird das Signal SIGWINCH an die Vordergrund-Prozessgruppe gesandt. Senden einer Unterbrechung TCSBRK Argument: int arg aquivalent zu tcsendbreak(dd, arg) Falls das Terminal asynchrone Datenubertragung verwendet und arg Null ist, wird eine Unterbrechung (ein Strom von Null-Bits) fur 0,25-0,5 Sekunden gesandt. Falls das Terminal keine asynchrone serielle Datenubertragung verwendet, wird entweder eine Unterbrechung gesandt oder die Funktion kehrt ohne Aktion zuruck. 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 fuhrt nichts aus, falls der Treiber keine Unterbrechungen unterstutzt. 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 aquivalent zu tcflow(dd, arg) siehe tcflow(3) fur die Argumentwerte TCOOFF, TCOON, TCIOFF, TCION Pufferzahlung 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 aquivalent zu tcflush(dd, arg) siehe tcflush(3) fur 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 unterstutzt werden. Wenn das Bit TIOCSER_TEMT gesetzt ist, wartet tcdrain(3) nicht und kehrt sofort zuruck. Eingabe vortauschen TIOCSTI Argument: const char *argp Das angegebene Byte in die Eingabewarteschlange einfugen. Seit Linux 6.2 konnte diese Aktion die Capability CAP_SYS_ADMIN benotigen (falls die Sysctl-Variable dev.tty.legacy_tiocsti auf >>false<< gesetzt ist). Konsolenausgabe umleiten TIOCCONS Argument: void Lenkt die Ausgabe, die an /dev/console oder /dev/tty0 gegangen ware, 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 zuruckgeliefert. 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. Fur diesen Fall sollte arg als Null angegeben werden. Falls dieses Terminal bereits das steuernde Terminal einer anderen Sitzungsgruppe ist, schlagt der Ioctl mit EPERM fehl. Verfugt der Aufrufende allerdings uber 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, aquivalent zu *argp = tcgetpgrp(dd) Die Prozessgruppenkennung der Vordergrundprozessgruppe auf diesem Terminal ermitteln. TIOCSPGRP Argument: const pid_t *argp aquivalent zu tcsetpgrp(dd, *argp) Die Vordergrundprozessgruppenkennung dieses Terminals setzen. TIOCGSID Argument: pid_t *argp wenn erfolgreich, aquivalent zu *argp = tcgetsid(dd) Ermittelt die Sitzungskennung des angegebenen Terminals. Dies schlagt mit dem Fehler ENOTTY fehl, falls das Terminal kein Master-Pseudoterminal und nicht unser steuerndes Terminal ist. Merkwurdig. 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, ausser 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 zuruck). Im Paketmodus wird jeder nachfolgende Schreibvorgang ein Paket zuruckliefern, 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, enthalt. Falls das erste Byte nicht TIOCPKT_DATA (0) ist, ist es eine ODER-Verknupfung eines oder mehrerer der folgenden Bits: TIOCPKT_FLUSHREAD Die Lese-Warteschlange fur das Terminal wird geleert. TIOCPKT_FLUSHWRITE Die Schreibe-Warteschlange fur 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. Wahrend der Paketmodus verwandt wird, kann die Anwesenheit von Steuerstatusinformationen, die von der Master-Seite gelesen werden sollen, fur aussergewohnliche Bedingungen durch ein select(2) oder ein poll(2) fur 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, zuruck. TIOCSPTLCK Argument: int *argp Setzt (falls *argp von Null verschieden ist) oder entfernt (falls *argp Null ist) die Sperre auf dem Pseudoterminal-Slave-Gerat. (Siehe auch unlockpt(3).) TIOCGPTLCK Argument: int *argp (Seit Linux 3.8) Legt den aktuellen Sperrstatus des Pseudoterminal-Slave-Gerats 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) geoffnet und ein neuer Datei-Deskriptor, der sich auf ein Peer-Pseudoterminal-Slave-Gerat bezieht, zuruckgeliefert. Diese Aktion kann unabhangig davon durchgefuhrt werden, ob der Pfadname des Slave-Gerates uber den Einhangenamensraum des aufrufenden Prozesses zugreifbar ist. Sicherheitsbewusste Anwendungen, die mit Namensraumen interagieren, konnten diese Aktionen statt open(2) mit von ptsname(3) zuruckgelieferten Pfadnamen und ahnliche Bibliotheksfunktionen, die unsichere APIs haben, benutzen. (Beispielsweise kann es in einigen Fallen bei der Verwendung von ptsname(3) mit einem Pfadnamen, bei dem ein Devpts-Dateisystem in einem anderen Einhangenamensraum eingehangt 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 zurucksetzen. 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 Sekundarer TXD (Ubertragung) TIOCM_SR Sekundarer RXD (Empfang) TIOCM_CTS CTS (klar zum Senden) TIOCM_CAR DCD (Datentrager-Erkennung) TIOCM_CD siehe TIOCM_CAR TIOCM_RNG RNG (Lauten) TIOCM_RI siehe TIOCM_RNG TIOCM_DSR DSR (Datensatz bereit) TIOCMIWAIT Argument: int arg Wartet auf die Anderung 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 verknupft wird. Der Aufrufende sollte TIOCGICOUNT verwenden, um zu schauen, welches Bit sich geandert 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-Ubergange werden gezahlt, ausser fur RI, bei dem nur 0->1-Ubergange gezahlt 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 fur eine Leitung ausgeschaltet ist, dann ist das Hardware-Tragererkennung- (DCD-)Signal bedeutend, und ein open(2) des entsprechenden Terminals wird blockieren, bis DCD festgestellt wurde, und die Leitung verhalt sich so, als ob DCD immer festgestellt worden ware. Der Software-Trager-Schalter wird normalerweise fur lokale Gerate eingeschaltet und ist fur Leitungen mit Modems ausgeschaltet. Linux-spezifisch Fur den TIOCLINUX-Ioctl, siehe ioctl_console(2). Kernel-Fehlersuche #include TIOCTTYGSTRUCT Argument: struct tty_struct *argp Die dd entsprechende tty_struct ermitteln. Dieser Befehl wurde in Linux 2.5.67 entfernt. RUCKGABEWERT Der Systemaufruf ioctl(2) liefert im Erfolgsfall 0 zuruck. Bei einem Fehler wird -1 zuruckgegeben und errno gesetzt, um den Fehler anzuzeigen. FEHLER EINVAL Ungultiger Befehlsparameter. ENOIOCTLCMD Unbekannter Befehl. ENOTTY Ungeeigneter dd. EPERM Unzureichende Berechtigung. BEISPIELE Die Bedingungen von DTR auf dem seriellen Port prufen. #include #include #include #include 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 #include #include #include #include #include int main(int argc, char *argv[]) { #if !defined BOTHER fprintf(stderr, "BOTHER wird nicht unterstutzt\n"); /* Program kann auf TCGETS/TCSETS mit Bnnn-Konstanten zuruckfallen */ exit(EXIT_FAILURE); #else /* tio-Struktur deklarieren, ihr Typ hangt vom unterstutzten 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 Gerat [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 unterstutztem Ioctl ermitteln */ # 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 andern, wenn mehr Argumente bereitgestellt wurden */ if (argc == 3 || argc == 4) { /* Aktuelle Baud-Rate bereinigen und einen neuen Wert einfullen */ tio.c_cflag &= ~CBAUD; tio.c_cflag |= BOTHER; tio.c_ospeed = atoi(argv[2]); /* Die aktuelle Eingabe-Baud-Rate bereinigen und einen neuen Wert einfullen */ tio.c_cflag &= ~(CBAUD << IBSHIFT); tio.c_cflag |= BOTHER << IBSHIFT; /* Falls das 4. Argument nicht bereitgestellt wurde, Ausgabe-Baud-Rate nochmals verwenden */ tio.c_ispeed = (argc == 4) ? atoi(argv[3]) : atoi(argv[2]); /* Neue Einstellungen des seriellen Ports mittels unterstutztem 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 neuen Werte erhalten, die wirklich konfiguriert wurden */ # 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-Baud-Rate: %u\n", tio.c_ospeed); printf("Eingabe-Baud-Rate: %u\n", tio.c_ispeed); exit(EXIT_SUCCESS); #endif } SIEHE AUCH ldattach(8), ioctl(2), ioctl_console(2), termios(3), pty(7) UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von 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_tty(2)