ioctl_tty - Ioctls pour les terminaux et lignes série
Bibliothèque C standard (
libc,
-lc)
#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, ...);
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>.
- 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 |
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.
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.
- 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.
- TCXONC
- Argument : int arg
- Équivalent à tcflow(fd, arg).
- Consultez tcflow(3) pour avoir la signification des
valeurs TCOOFF, TCOON, TCIOFF et TCION.
- 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.
- TIOCSTI
- Argument : const
char *argp
- Insérer l'octet donné dans la queue
d'entrée.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
Pour l'ioctl
TIOCLINUX, reportez-vous à
ioctl_console(2).
#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.
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.
- EINVAL
- Paramètre de commande non valable.
- ENOIOCTLCMD
- Commande inconnue.
- ENOTTY
-
fd inapproprié.
- EPERM
- Droits insuffisants.
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
}
ldattach(8),
ioctl(2),
ioctl_console(2),
termios(3),
pty(7)
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]