ioctl_tty(2) System Calls Manual ioctl_tty(2) NOM ioctl_tty - Ioctls pour les terminaux et lignes serie BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include #include /* Definition de struct termios, struct termios2 et Bnnn, BOTHER, CBAUD, CLOCAL, TC*{FLUSH,ON,OFF} et d'autres constantes */ int ioctl(int fd, int cmd, ...); DESCRIPTION Les appels systeme ioctl(2) pour les terminaux et les ports serie acceptent differents parametres possibles. La plupart necessitent un troisieme parametre, d'un type variable, appele argp ou arg. Utiliser des ioctls rend les programmes non portables. Utilisez l'interface POSIX decrite dans termios(3) si possible. Veuillez noter que struct termios de est differente et incompatible avec struct termios de . Ces appels ioctl exigent struct termios de . Recuperer et positionner les attributs d'un terminal TCGETS Argument : struct termios *argp Equivalent a tcgetattr(fd, argp). Recuperer la configuration du port serie courant. TCSETS Argument : const struct termios *argp Equivalent a tcsetattr(fd, TCSANOW, argp). Configurer le port serie courant. TCSETSW Argument : const struct termios *argp Equivalent a tcsetattr(fd, TCSADRAIN, argp). Laisser le tampon de sortie se vider, puis configurer le port serie courant. TCSETSF Argument : const struct termios *argp Equivalent a tcsetattr(fd, TCSAFLUSH, argp). Laisser le tampon de sortie se vider, abandonner toute entree en cours, puis configurer le port serie courant. Les quatre ioctls suivants, ajoutes a Linux 2.6.20, sont equivalents a TCGETS, TCSETS, TCSETSW, TCSETSF, sauf qu'ils prennent une struct termios2 * a la place d'une struct termios *. Si le membre de structure c_cflag contient l'attribut BOTHER, le debit en bauds est stocke dans les membres de structure c_ispeed et c_ospeed en tant qu'entier. Ces ioctls ne sont pas pris en charge sur toutes les architectures. TCGETS2 struct termios2 *argp TCSETS2 const struct termios2 *argp TCSETSW2 const struct termios2 *argp TCSETSF2 const struct termios2 *argp Les quatre ioctls suivants sont equivalents a TCGETS, TCSETS, TCSETSW et TCSETSF, sauf qu'ils prennent une structure struct termio * a la place d'une struct termios *. TCGETA struct termio *argp TCSETA const struct termio *argp TCSETAW const struct termio *argp TCSETAF const struct termio *argp Verrouiller une structure termios La structure termios d'un terminal peut etre verrouillee. Le verrou est en lui-meme une structure termios, dont les bits ou champs non nuls indiquent une valeur verrouillee. TIOCGLCKTRMIOS Argument : struct termios *argp Recuperer l'etat du verrou de la structure termios du terminal. TIOCSLCKTRMIOS Argument : const struct termios *argp Definir l'etat du verrou de la structure termios du terminal. Seul un processus avec la capacite CAP_SYS_ADMIN peut faire cela. Recuperer et configurer les tailles de fenetre Les tailles de fenetre sont stockees dans le noyau, mais ne sont pas utilisees par le noyau (sauf pour les consoles virtuelles, pour lesquelles le noyau met a jour les tailles de fenetre quand la taille d'une console virtuelle change, par exemple lors du chargement d'une nouvelle fonte). TIOCGWINSZ Argument : struct winsize *argp Recuperer la taille de la fenetre. TIOCSWINSZ Argument : const struct winsize *argp Definir la taille de la fenetre. La structure utilisee par ces ioctls est la suivante : struct winsize { unsigned short ws_row; unsigned short ws_col; unsigned short ws_xpixel; /* non utilise */ unsigned short ws_ypixel; /* non utilise */ }; Lorsque la taille d'une fenetre change, un signal SIGWINCH est envoye au groupe de processus au premier plan. Envoyer une interruption (<< break >>) TCSBRK Argument : int arg Equivalent a tcsendbreak(fd, arg). Si le terminal utilise un mode de transmission serie asynchrone et que arg est nul, alors une interruption (un flux de bits nuls) est envoyee pendant 0,25 a 0,5 seconde. Si le terminal n'utilise pas un mode de transmission serie asynchrone, alors soit une interruption est envoyee, soit la fonction ne fait rien. Quand arg est non nul, le comportement n'est pas defini. (SVr4, UnixWare, Solaris et Linux traitent tcsendbreak(fd,arg) avec un parametre arg non nul de la meme facon que tcdrain(fd). SunOS considere arg comme un coefficient multiplicateur et envoie un flux de bits arg fois plus long que lorsque arg est nul. DG/UX et AIX traitent arg (lorsqu'il est non nul) comme un intervalle de temps exprime en millisecondes. HP-UX ignore arg.) TCSBRKP Argument : int arg Ce qu'on appelle la << version POSIX >> de TCSBRK. Elle traite le arg non nul comme un intervalle de temps mesure en dixiemes de seconde et ne fait rien lorsque le pilote ne gere pas les interruptions. TIOCSBRK Argument : void Activer les interruptions, c'est-a-dire commencer a envoyer des bits nuls. TIOCCBRK Argument : void Desactiver les interruptions, c'est-a-dire arreter d'envoyer les bits nuls. Controle de flux logiciel TCXONC Argument : int arg Equivalent a tcflow(fd, arg). Consultez tcflow(3) pour avoir la signification des valeurs TCOOFF, TCOON, TCIOFF et TCION. Information sur les tampons et vidage FIONREAD Argument : int *argp Recuperer le nombre d'octets dans le tampon d'entree. TIOCINQ Argument : int *argp Identique a FIONREAD. TIOCOUTQ Argument : int *argp Recuperer le nombre d'octets dans le tampon de sortie. TCFLSH Argument : int arg Equivalent a tcflush(fd, arg). Consultez tcflush(3) pour la signification de TCIFLUSH, TCOFLUSH et TCIOFLUSH. TIOCSERGETLSR Argument : int *argp Recuperer le registre d'etat de ligne. Le registre d'etat a le bit TIOCSER_TEMT defini quand le tampon de sortie est vide et qu'egalement le transmetteur materiel est physiquement vide. Ne doit pas etre pris en charge par tous les pilotes tty serie. tcdrain(3) n'attend pas et renvoie immediatement lorsque le bit TIOCSER_TEMT est defini. Simuler l'entree TIOCSTI Argument : const char *argp Inserer l'octet donne dans la queue d'entree. Depuis Linux 6.2, cette operation peut requerir la capacite CAP_SYS_ADMIN (si la variable dev.tty.legacy_tiocsti de sysctl est definie a false). Rediriger la sortie de la console TIOCCONS Argument : void Rediriger la sortie qui serait allee vers /dev/console ou /dev/tty0 vers un terminal donne. S'il s'agit d'un pseudoterminal maitre, envoyer a l'esclave. Avant Linux 2.6.10, n'importe qui peut utiliser cet appel a condition que la sortie ne soit pas deja redirigee ; depuis Linux 2.6.10, seul un processus avec la capacite CAP_SYS_ADMIN peut l'utiliser. Si elle a deja ete redirigee, EBUSY est renvoyee, mais la redirection peut etre arretee en utilisant cet ioctl avec fd pointant vers /dev/console ou /dev/tty0. Terminal de controle TIOCSCTTY Argument : int arg Faire du terminal donne le terminal de controle du processus appelant. Le processus appelant doit etre un leader de session et ne doit pas deja avoir de terminal de controle. Dans ce cas, arg doit valoir zero. Si ce terminal est deja le terminal de controle d'une autre session, alors l'ioctl echoue avec le code d'erreur EPERM, a moins que l'appelant soit un superutilisateur (plus precisement : qu'il ait la capacite CAP_SYS_ADMIN) et que arg vaille 1. Dans ce dernier cas, le terminal est << vole >>, et tous les processus pour lesquels c'etait le terminal de controle le perdent. TIOCNOTTY Argument : void Si le terminal donne est le terminal de controle du processus appelant, abandonner ce terminal de controle. Si le processus est un leader de session, alors SIGHUP et SIGCONT seront envoyes au groupe de processus au premier plan, et tous les processus de la session perdent leur terminal de controle. Groupe de processus et identifiant de session TIOCGPGRP Argument : pid_t *argp En cas de succes, equivalent a *argp = tcgetpgrp(fd). Recuperer l'identifiant du groupe de processus au premier plan sur ce terminal. TIOCSPGRP Argument : const pid_t *argp Equivalent a tcsetpgrp(fd, *argp). Definir l'identifiant du groupe de processus au premier plan du terminal. TIOCGSID Argument : pid_t *argp En cas de succes, equivalent a *argp = tcgetsid(fd). Recuperer l'identifiant de session du terminal donne. L'appel echouera avec pour erreur ENOTTY si le terminal n'est pas un pseudoterminal maitre et n'est pas notre terminal de controle. Etrange. Mode exclusif TIOCEXCL Argument : void Mettre le terminal en mode exclusif. Plus aucun appel open(2) sur le terminal ne sera autorise. (Ils echoueront avec l'erreur EBUSY, sauf pour un processus ayant la capacite CAP_SYS_ADMIN.) TIOCGEXCL Argument : int *argp (Depuis Linux 3.8) Si le terminal est actuellement en mode exclusif, mettre une valeur positive a l'endroit vers lequel pointe argp ; sinon mettre un zero dans *argp. TIOCNXCL Argument : void Desactiver le mode exclusif. Parametres de la ligne (<< line discipline >>) TIOCGETD Argument : int *argp Recuperer les parametres de la ligne du terminal. TIOCSETD Argument : const int *argp Definir les parametres de la ligne (<< line discipline >>) du terminal. Ioctls pour les pseudoterminaux TIOCPKT Argument : const int *argp Activer (quand *argp n'est pas nul) ou desactiver le mode paquet. Ne peut etre applique qu'a la partie maitre d'un pseudoterminal (renvoie ENOTTY sinon). En mode paquet, chaque read(2) suivant renverra un paquet qui contient soit un seul octet de controle non nul, soit un unique octet nul ('\0') suivi par les donnees ecrites du cote esclave du pseudoterminal. Si le premier octet n'est pas TIOCPKT_DATA (0), il s'agit d'un OU logique entre les bits suivants : TIOCPKT_FLUSHREAD La file de lecture du terminal est videe. TIOCPKT_FLUSHWRITE La file d'ecriture du terminal est videe. TIOCPKT_STOP La sortie sur le terminal est arretee. TIOCPKT_START La sortie sur le terminal est redemarree. TIOCPKT_DOSTOP Les caracteres de demarrage et d'arret sont ^S/^Q. TIOCPKT_NOSTOP Les caracteres de demarrage et d'arret ne sont pas ^S/^Q. Tant que le mode paquet est utilise, la presence d'informations d'etat de controle a lire du cote maitre peut etre detectee avec select(2) pour les conditions exceptionnelles ou un poll(2) pour l'evenement POLLPRI. Ce mode est utilise par rlogin(1) et rlogind(8) pour implementer l'envoi distant du controle de flux ^S/^Q en local. TIOCGPKT Argument : const int *argp (Depuis Linux 3.8) Renvoyer le parametre du mode paquet actuel dans l'entier vers lequel pointe argp. TIOCSPTLCK Argument : int *argp Positionner (si *argp n'est pas nul) ou effacer (si *argp est zero) le verrou sur le peripherique esclave du pseudoterminal (voir aussi unlockpt(3)). TIOCGPTLCK Argument : int *argp (Depuis Linux 3.8) Mettre l'etat actuel du verrou du peripherique esclave du terminal virtuel a l'emplacement vers lequel pointe argp. TIOCGPTPEER Argument : int flags (Depuis Linux 4.13) A partir d'un descripteur de fichier de fd qui se rapporte a un terminal virtuel maitre, ouvrir (avec les flags donnes a la maniere de open(2)) et renvoyer un nouveau descripteur de fichier qui renvoie au terminal virtuel esclave correspondant. Cette operation peut etre effectuee que le chemin du peripherique esclave soit accessible par l'espace de noms de montage du processus appelant ou pas. Les programmes soucieux de la securite qui interagissent avec les espaces de noms peuvent souhaiter utiliser cette operation au lieu de open(2) avec le chemin renvoye par ptsname(3) et les fonctions de bibliotheque semblables ayant des APIs non securisees (par exemple, il peut y avoir des confusions dans certains cas en utilisant ptsname(3) avec un chemin ou un systeme de fichiers devpts a ete monte dans un autre espace de noms de montage). Les ioctls BSD TIOCSTOP, TIOCSTART, TIOCUCNTL et TIOCREMOTE n'ont pas ete implementes sous Linux. Controle des modems TIOCMGET Argument : int *argp Recuperer l'etat des bits du modem. TIOCMSET Argument : const int *argp Definir l'etat des bits du modem. TIOCMBIC Argument : const int *argp Effacer les bits du modem indiques. TIOCMBIS Argument : const int *argp Positionner les bits du modem indiques. Les bits suivants sont utilises par les ioctls ci-dessus : TIOCM_LE DSR (data set ready/ligne activee) TIOCM_DTR DTR (data terminal ready, terminal de donnees pret) TIOCM_RTS RTS (request to send, requete a envoyer) TIOCM_ST TXD secondaire (transmit) TIOCM_SR RXD secondaire (receive) TIOCM_CTS CTS (clear to send, vider pour envoyer) TIOCM_CAR DCD (data carrier detect) TIOCM_CD voir TIOCM_CAR TIOCM_RNG RNG (ring) TIOCM_RI voir TIOCM_RNG TIOCM_DSR DSR (data set ready) TIOCMIWAIT Argument : int arg Attendre qu'un des bits de modem (DCD, RI, DSR, CTS) change. Les bits interessants sont indiques sous la forme de masques de bits dans arg en reliant (operation OR) toutes les valeurs de bits, TIOCM_RNG, TIOCM_DSR, TIOCM_CD et TIOCM_CTS. L'appelant doit utiliser TIOCGICOUNT pour savoir le bit qui a change. TIOCGICOUNT Argument : struct serial_icounter_struct *argp Recuperer le nombre d'interruptions de la ligne serie d'entree (DCD, RI, DSR, CTS). Le nombre est ecrit dans une structure serial_icounter_struct vers laquelle pointe argp. Note : les transitions 1->0 et 0->1 sont prises en compte, sauf pour RI, ou seules les transitions 0->1 sont prises en compte. Marquer une ligne comme etant locale TIOCGSOFTCAR Argument : int *argp (GSOFTCAR : << Get SOFTware CARrier flag >>) Recuperer l'etat du drapeau CLOCAL dans le champ c_cflag de la structure termios. TIOCSSOFTCAR Argument : const int *argp (SSOFTCAR : << Set SOFTware CARrier flag >>) Positionner le drapeau CLOCAL de la structure termios si *argp n'est pas nul, et l'effacer dans le cas contraire. Si le drapeau CLOCAL d'une ligne est desactive, le signal de detection de porteuse (DCD) est significatif et un appel a open(2) sur le terminal correspondant sera bloque tant que le signal DCD sera maintenu, a moins que le drapeau O_NONBLOCK soit fourni. Si CLOCAL est positionne, la ligne se comporte comme si DCD etait maintenu en permanence. Le drapeau logiciel pour la porteuse est generalement positionne pour les peripheriques locaux et desactive pour les lignes par modem. Specifique a Linux Pour l'ioctl TIOCLINUX, reportez-vous a ioctl_console(2). Debogage du noyau #include TIOCTTYGSTRUCT Argument : struct tty_struct *argp Recuperer la structure tty_struct correspondant a fd. Cette commande a ete supprimee dans Linux 2.5.67. VALEUR RENVOYEE L'appel systeme ioctl(2) renvoie 0 en cas de succes. En cas d'erreur, il renvoie -1 et positionne errno pour indiquer l'erreur. ERREURS EINVAL Parametre de commande non valable. ENOIOCTLCMD Commande inconnue. ENOTTY fd inapproprie. EPERM Droits insuffisants. EXEMPLES Verifier l'etat de DTR sur un port serie. #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 is set"); else puts("TIOCM_DTR is not set"); close(fd); } Recuperer ou definir un debit en bauds sur le port serie. /* 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 n'est pas pris en charge\n"); /* Le programme peut se rabattre sur TCGETS/TCSETS avec des constantes Bnnn */ exit(EXIT_FAILURE); #else /* Declarer la structure tio, son type depend de l'ioctl pris en charge */ # if defined TCGETS2 struct termios2 tio; # else struct termios tio; # endif int fd, rc; if (argc != 2 && argc != 3 && argc != 4) { fprintf(stderr, "Usage: %s device [output [input] ]\n", argv[0]); exit(EXIT_FAILURE); } fd = open(argv[1], O_RDWR | O_NONBLOCK | O_NOCTTY); if (fd < 0) { perror("open"); exit(EXIT_FAILURE); } /* Recuperer les parametres du port serie actuel a l'aide de l'ioctl pris en charge */ # if defined TCGETS2 rc = ioctl(fd, TCGETS2, &tio); # else rc = ioctl(fd, TCGETS, &tio); # endif if (rc) { perror("TCGETS"); close(fd); exit(EXIT_FAILURE); } /* Modifier le debit en bauds quand plus d'arguments ont ete fournis */ if (argc == 3 || argc == 4) { /* Effacer le debit en bauds en sortie actuel et definir une nouvelle valeur */ tio.c_cflag &= ~CBAUD; tio.c_cflag |= BOTHER; tio.c_ospeed = atoi(argv[2]); /* Effacer le debit en bauds en entree actuel et definir une nouvelle valeur */ tio.c_cflag &= ~(CBAUD << IBSHIFT); tio.c_cflag |= BOTHER << IBSHIFT; /* Quand le 4e argument n'est pas fourni, reutiliser le debit en bauds de sortie */ tio.c_ispeed = (argc == 4) ? atoi(argv[3]) : atoi(argv[2]); /* Definir de nouveaux parametres du port serie a l'aide de l'ioctl pris en charge */ # if defined TCSETS2 rc = ioctl(fd, TCSETS2, &tio); # else rc = ioctl(fd, TCSETS, &tio); # endif if (rc) { perror("TCSETS"); close(fd); exit(EXIT_FAILURE); } /* Et obtenir de nouvelles valeurs vraiment configurees */ # 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("debit en bauds en sortie : %u\n", tio.c_ospeed); printf("debit en bauds en entree : %u\n", tio.c_ispeed); exit(EXIT_SUCCESS); #endif } VOIR AUSSI ldattach(8), ioctl(2), ioctl_console(2), termios(3), pty(7) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot , Jean-Philippe MENGUAL et Jean-Pierre Giraud Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 ioctl_tty(2)