NOM

ioctl_tty - Ioctls pour les terminaux et lignes série

BIBLIOTHÈQUE

Bibliothèque C standard ( libc, -lc)

SYNOPSIS

#include <sys/ioctl.h>
#include <asm/termbits.h>   /* Définition 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 système ioctl(2) pour les terminaux et les ports série acceptent différents paramètres possibles. La plupart nécessitent un troisième paramètre, d'un type variable, appelé argp ou arg.
Utiliser des ioctls rend les programmes non portables. Utilisez l'interface POSIX décrite dans termios(3) si possible.
Veuillez noter que struct termios de <asm/termbits.h> est différente et incompatible avec struct termios de <termios.h>. Ces appels ioctl exigent struct termios de <asm/termbits.h>.

Récupérer et positionner les attributs d'un terminal

TCGETS
Argument : struct termios *argp
Équivalent à tcgetattr(fd, argp).
Récupérer la configuration du port série courant.
TCSETS
Argument : const struct termios *argp
Équivalent à tcsetattr(fd, TCSANOW, argp).
Configurer le port série courant.
TCSETSW
Argument : const struct termios *argp
Équivalent à tcsetattr(fd, TCSADRAIN, argp).
Laisser le tampon de sortie se vider, puis configurer le port série courant.
TCSETSF
Argument : const struct termios *argp
Équivalent à tcsetattr(fd, TCSAFLUSH, argp).
Laisser le tampon de sortie se vider, abandonner toute entrée en cours, puis configurer le port série courant.
Les quatre ioctls suivants, ajoutés à Linux 2.6.20, sont équivalents à TCGETS, TCSETS, TCSETSW, TCSETSF, sauf qu'ils prennent une struct termios2 * à la place d'une struct termios *. Si le membre de structure c_cflag contient l'attribut BOTHER, le débit en bauds est stocké 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 équivalents à TCGETS, TCSETS, TCSETSW et TCSETSF, sauf qu'ils prennent une structure struct termio * à 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 être verrouillée. Le verrou est en lui-même une structure termios, dont les bits ou champs non nuls indiquent une valeur verrouillée.
TIOCGLCKTRMIOS
Argument : struct termios *argp
Récupérer l'état du verrou de la structure termios du terminal.
TIOCSLCKTRMIOS
Argument : const struct termios *argp
Définir l'état du verrou de la structure termios du terminal. Seul un processus avec la capacité CAP_SYS_ADMIN peut faire cela.

Récupérer et configurer les tailles de fenêtre

Les tailles de fenêtre sont stockées dans le noyau, mais ne sont pas utilisées par le noyau (sauf pour les consoles virtuelles, pour lesquelles le noyau met à jour les tailles de fenêtre quand la taille d'une console virtuelle change, par exemple lors du chargement d'une nouvelle fonte).
TIOCGWINSZ
Argument : struct winsize *argp
Récupérer la taille de la fenêtre.
TIOCSWINSZ
Argument : const struct winsize *argp
Définir la taille de la fenêtre.
La structure utilisée par ces ioctls est la suivante :

struct winsize {
    unsigned short ws_row;
    unsigned short ws_col;
    unsigned short ws_xpixel;   /* non utilisé */
    unsigned short ws_ypixel;   /* non utilisé */
};

Lorsque la taille d'une fenêtre change, un signal SIGWINCH est envoyé au groupe de processus au premier plan.

Envoyer une interruption (« break »)

TCSBRK
Argument : int arg
Équivalent à tcsendbreak(fd, arg).
Si le terminal utilise un mode de transmission série asynchrone et que arg est nul, alors une interruption (un flux de bits nuls) est envoyée pendant 0,25 à 0,5 seconde. Si le terminal n'utilise pas un mode de transmission série asynchrone, alors soit une interruption est envoyée, soit la fonction ne fait rien. Quand arg est non nul, le comportement n'est pas défini.
(SVr4, UnixWare, Solaris et Linux traitent tcsendbreak(fd,arg) avec un paramètre arg non nul de la même façon que tcdrain(fd). SunOS considère 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 exprimé 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 mesuré en dixièmes de seconde et ne fait rien lorsque le pilote ne gère pas les interruptions.
TIOCSBRK
Argument : void
Activer les interruptions, c'est-à-dire commencer à envoyer des bits nuls.
TIOCCBRK
Argument : void
Désactiver les interruptions, c'est-à-dire arrêter d'envoyer les bits nuls.

Contrôle de flux logiciel

TCXONC
Argument : int arg
Équivalent à 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
Récupérer le nombre d'octets dans le tampon d'entrée.
TIOCINQ
Argument : int *argp
Identique à FIONREAD.
TIOCOUTQ
Argument : int *argp
Récupérer le nombre d'octets dans le tampon de sortie.
TCFLSH
Argument : int arg
Équivalent à tcflush(fd, arg).
Consultez tcflush(3) pour la signification de TCIFLUSH, TCOFLUSH et TCIOFLUSH.
TIOCSERGETLSR
Argument : int *argp
Récupérer le registre d'état de ligne. Le registre d'état a le bit TIOCSER_TEMT défini quand le tampon de sortie est vide et qu'également le transmetteur matériel est physiquement vide.
Ne doit pas être pris en charge par tous les pilotes tty série.
tcdrain(3) n'attend pas et renvoie immédiatement lorsque le bit TIOCSER_TEMT est défini.

Simuler l'entrée

TIOCSTI
Argument : const char *argp
Insérer l'octet donné dans la queue d'entrée.

Rediriger la sortie de la console

TIOCCONS
Argument : void
Rediriger la sortie qui serait allée vers /dev/console ou /dev/tty0 vers un terminal donné. S'il s'agit d'un pseudoterminal maître, envoyer à l'esclave. Avant Linux 2.6.10, n'importe qui peut utiliser cet appel à condition que la sortie ne soit pas déjà redirigée ; depuis Linux 2.6.10, seul un processus avec la capacité CAP_SYS_ADMIN peut l'utiliser. Si elle a déjà été redirigée, EBUSY est renvoyée, mais la redirection peut être arrêtée en utilisant cet ioctl avec fd pointant vers /dev/console ou /dev/tty0.

Terminal de contrôle

TIOCSCTTY
Argument : int arg
Faire du terminal donné le terminal de contrôle du processus appelant. Le processus appelant doit être un leader de session et ne doit pas déjà avoir de terminal de contrôle. Dans ce cas, arg doit valoir zéro.
Si ce terminal est déjà le terminal de contrôle d'une autre session, alors l'ioctl échoue avec le code d'erreur EPERM, à moins que l'appelant soit un superutilisateur (plus précisément : qu'il ait la capacité CAP_SYS_ADMIN) et que arg vaille 1. Dans ce dernier cas, le terminal est « volé », et tous les processus pour lesquels c'était le terminal de contrôle le perdent.
TIOCNOTTY
Argument : void
Si le terminal donné est le terminal de contrôle du processus appelant, abandonner ce terminal de contrôle. Si le processus est un leader de session, alors SIGHUP et SIGCONT seront envoyés au groupe de processus au premier plan, et tous les processus de la session perdent leur terminal de contrôle.

Groupe de processus et identifiant de session

TIOCGPGRP
Argument : pid_t *argp
En cas de succès, équivalent à *argp = tcgetpgrp(fd).
Récupérer l'identifiant du groupe de processus au premier plan sur ce terminal.
TIOCSPGRP
Argument : const pid_t *argp
Équivalent à tcsetpgrp(fd, *argp).
Définir l'identifiant du groupe de processus au premier plan du terminal.
TIOCGSID
Argument : pid_t *argp
En cas de succès, équivalent à *argp = tcgetsid(fd).
Récupérer l'identifiant de session du terminal donné. L'appel échouera avec pour erreur ENOTTY si le terminal n'est pas un pseudoterminal maître et n'est pas notre terminal de contrôle. Étrange.

Mode exclusif

TIOCEXCL
Argument : void
Mettre le terminal en mode exclusif. Plus aucun appel open(2) sur le terminal ne sera autorisé. (Ils échoueront avec l'erreur EBUSY, sauf pour un processus ayant la capacité CAP_SYS_ADMIN.)
TIOCGEXCL
Argument : int *argp
(Depuis Linux 3.8) Si le terminal est actuellement en mode exclusif, mettre une valeur positive à l'endroit vers lequel pointe argp ; sinon mettre un zéro dans *argp.
TIOCNXCL
Argument : void
Désactiver le mode exclusif.

Paramètres de la ligne (« line discipline »)

TIOCGETD
Argument : int *argp
Récupérer les paramètres de la ligne du terminal.
TIOCSETD
Argument : const int *argp
Définir les paramètres de la ligne (« line discipline ») du terminal.

Ioctls pour les pseudoterminaux

TIOCPKT
Argument : const int *argp
Activer (quand *argp n'est pas nul) ou désactiver le mode paquet. Ne peut être appliqué qu'à la partie maître d'un pseudoterminal (renvoie ENOTTY sinon). En mode paquet, chaque read(2) suivant renverra un paquet qui contient soit un seul octet de contrôle non nul, soit un unique octet nul ('\0') suivi par les données écrites du côté 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 vidée.
TIOCPKT_FLUSHWRITE La file d'écriture du terminal est vidée.
TIOCPKT_STOP La sortie sur le terminal est arrêtée.
TIOCPKT_START La sortie sur le terminal est redémarrée.
TIOCPKT_DOSTOP Les caractères de démarrage et d'arrêt sont ^S/ ^Q.
TIOCPKT_NOSTOP Les caractères de démarrage et d'arrêt ne sont pas ^S/^Q.
Tant que le mode paquet est utilisé, la présence d'informations d'état de contrôle à lire du côté maître peut être détectée avec select(2) pour les conditions exceptionnelles ou un poll(2) pour l'événement POLLPRI.
Ce mode est utilisé par rlogin(1) et rlogind(8) pour implémenter l'envoi distant du contrôle de flux ^S/^Q en local.
TIOCGPKT
Argument : const int *argp
(Depuis Linux 3.8) Renvoyer le paramètre 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 zéro) le verrou sur le périphérique esclave du pseudoterminal (voir aussi unlockpt(3)).
TIOCGPTLCK
Argument : int *argp
(Depuis Linux 3.8) Mettre l'état actuel du verrou du périphérique esclave du terminal virtuel à l'emplacement vers lequel pointe argp.
TIOCGPTPEER
Argument : int flags
(Depuis Linux 4.13) À partir d'un descripteur de fichier de fd qui se rapporte à un terminal virtuel maître, ouvrir (avec les flags donnés à la manière de open(2)) et renvoyer un nouveau descripteur de fichier qui renvoie au terminal virtuel esclave correspondant. Cette opération peut être effectuée que le chemin du périphérique esclave soit accessible par l'espace de noms de montage du processus appelant ou pas.
Les programmes soucieux de la sécurité qui interagissent avec les espaces de noms peuvent souhaiter utiliser cette opération au lieu de open(2) avec le chemin renvoyé par ptsname(3) et les fonctions de bibliothèque semblables ayant des APIs non sécurisées (par exemple, il peut y avoir des confusions dans certains cas en utilisant ptsname(3) avec un chemin où un système de fichiers devpts a été monté dans un autre espace de noms de montage).
Les ioctls BSD TIOCSTOP, TIOCSTART, TIOCUCNTL et TIOCREMOTE n'ont pas été implémentés sous Linux.

Contrôle des modems

TIOCMGET
Argument : int *argp
Récupérer l'état des bits du modem.
TIOCMSET
Argument : const int *argp
Définir l'état des bits du modem.
TIOCMBIC
Argument : const int *argp
Effacer les bits du modem indiqués.
TIOCMBIS
Argument : const int *argp
Positionner les bits du modem indiqués.
Les bits suivants sont utilisés par les ioctls ci-dessus :
TIOCM_LE DSR (data set ready/ligne activée)
TIOCM_DTR DTR (data terminal ready, terminal de données prêt)
TIOCM_RTS RTS (request to send, requête à 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 intéressants sont indiqués sous la forme de masques de bits dans arg en reliant (opération 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 changé.
TIOCGICOUNT
Argument : struct serial_icounter_struct * argp
Récupérer le nombre d'interruptions de la ligne série d'entrée (DCD, RI, DSR, CTS). Le nombre est écrit 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, où seules les transitions 0->1 sont prises en compte.

Marquer une ligne comme étant locale

TIOCGSOFTCAR
Argument : int *argp
(GSOFTCAR : « Get SOFTware CARrier flag ») Récupérer l'état 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 désactivé, le signal de détection de porteuse (DCD) est significatif et un appel à open(2) sur le terminal correspondant sera bloqué tant que le signal DCD sera maintenu, à moins que le drapeau O_NONBLOCK soit fourni. Si CLOCAL est positionné, la ligne se comporte comme si DCD était maintenu en permanence. Le drapeau logiciel pour la porteuse est généralement positionné pour les périphériques locaux et désactivé pour les lignes par modem.

Spécifique à Linux

Pour l'ioctl TIOCLINUX, reportez-vous à ioctl_console(2).

Débogage du noyau

#include <linux/tty.h>
TIOCTTYGSTRUCT
Argument : struct tty_struct *argp
Récupérer la structure tty_struct correspondant à fd. Cette commande a été supprimée dans Linux 2.5.67.

VALEUR RENVOYÉE

L'appel système ioctl(2) renvoie 0 en cas de succès. En cas d'erreur, il renvoie -1 et positionne errno pour indiquer l'erreur.

ERREURS

EINVAL
Paramètre de commande non valable.
ENOIOCTLCMD
Commande inconnue.
ENOTTY
fd inapproprié.
EPERM
Droits insuffisants.

EXEMPLES

Vérifier l’état de DTR sur un port série.
#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 is set"); else puts("TIOCM_DTR is not set"); close(fd); }
Récupérer ou définir un débit en bauds sur le port série.
/* 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 n'est pas pris en charge\n"); /* Le programme peut se rabattre sur TCGETS/TCSETS avec des constantes Bnnn */ exit(EXIT_FAILURE); #else /* Déclarer la structure tio, son type dépend 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, "Utilisation : %s périphérique [sortie] [entrée] ]\n", argv[0]); exit(EXIT_FAILURE); }
fd = open(argv[1], O_RDWR | O_NONBLOCK | O_NOCTTY); if (fd < 0) { perror("open"); exit(EXIT_FAILURE); }
/* Récupérer les paramètres du port série actuel à 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 débit en bauds quand plus d'arguments ont été fournis */ if (argc == 3 || argc == 4) { /* Effacer le débit en bauds en sortie actuel et définir une nouvelle valeur */ tio.c_cflag &= ~CBAUD; tio.c_cflag |= BOTHER; tio.c_ospeed = atoi(argv[2]);
/* Effacer le débit en bauds en entrée actuel et définir une nouvelle valeur */ tio.c_cflag &= ~(CBAUD << IBSHIFT); tio.c_cflag |= BOTHER << IBSHIFT; /* Quand le 4e argument n'est pas fourni, réutiliser le débit en bauds de sortie */ tio.c_ispeed = (argc == 4) ? atoi(argv[3]) : atoi(argv[2]);
/* Définir de nouveaux paramètres du port série à 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 configurées */ # 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("débit en bauds en sortie : %u\n", tio.c_ospeed); printf("débit en bauds en entrée : %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 française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <[email protected]>, Thierry Vignaud <[email protected]>, François Micaux, Alain Portal <[email protected]>, Jean-Philippe Guérard <[email protected]>, Jean-Luc Coulon (f5ibh) <[email protected]>, Julien Cristau <[email protected]>, Thomas Huriaux <[email protected]>, Nicolas François <[email protected]>, Florentin Duneau <[email protected]>, Simon Paillard <[email protected]>, Denis Barbier <[email protected]>, David Prévot <[email protected]>, Jean-Philippe MENGUAL <[email protected]> et Jean-Pierre Giraud <[email protected]>
Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à [email protected]