Section courante

A propos

Section administrative du site

Entrée/sortie console

Les entrées/sorties de console peuvent être exécutées de différentes manières :

Il existe un mode par défaut pour les entrées/sorties de la console, étant en vigueur à moins d'être modifié par un appel à la fonction ioctl. Ainsi, les programmes peuvent accéder à la console dans le mode par défaut sans rien faire de spécial. Ou bien, les entrées/sorties de la console peuvent facilement être personnalisées pour se comporter comme souhaité par le programmeur.

Dans le mode par défaut pour l'entrée de la console, le système maintient une mémoire tampon interne de caractères qu'il a lu à partir du clavier. Les caractères sont renvoyés au programme à partir de ce tampon. Lorsque le tampon est vide, le système lit une ligne de caractères du clavier dans le tampon : le programme est suspendu pendant ce temps. L'opérateur peut utiliser les fonctions d'édition de ligne fournies par le système d'exploitation et les caractères saisis sont renvoyés à l'affichage. Enfin, les caractères de retour chariot sont convertis en caractères de nouvelle ligne. Dans le mode par défaut, la sortie de la console est sans tampon (comme pour tous les autres modes). Les caractères de nouvelle ligne sont convertis en retour chariot - séquence de saut de ligne. Un programme sélectionne les modes d'entrée/sortie de la console à l'aide de la fonction ioctl. Elle a le format :

#include "sgtty.h"
ioctl(fd,code, arg)
struct sgttyb *arg;

Le fichier d'entête sgtty.h définit des valeurs symboliques pour le paramètre de code (indiquant à ioctl ce qu'il doit faire) et la structure sgttyb. Le paramètre fd est un descripteur de fichier associé à la console. Sous UNIX, ce paramètre définit le descripteur de fichier associé au périphérique auquel s'applique l'appel ioctl. Ici, ioctl s'applique toujours à la console. Le code de paramètre définit l'action à effectuer par ioctl. Il peut avoir ces valeurs :

Constante Description
TIOCGETP Récupérer les paramètres de la console et les entreposer dans la structure pointée par arg.
TIOCSETP et TIOCSETN Définir les paramètres de la console en fonction de la structure pointée par arg.

Le paramètre arg pointe vers une structure ayant le format suivant :

struct sgttyb {
char sg_erase;
char sg-ki11;
int sg_flags;
}

Seul sg_flags est utilisé par Aztec C; le reste est fourni pour la compatibilité UNIX. Le sg_flags détermine le mode d'entrée/sortie de la console. Voici les valeurs symboliques qu'il peut prendre :

Constante Description
RAW Règle le mode RAW (désactive CBREAK, ECHO et CRMOD).
CBREAK Renvoie chaque caractère dès qu'il est saisi.
ECHO Faire écho aux caractères d'entrée à l'écran.
CRMOD Cartographie CR à LF en entrée; convertir LF en CR-LF en sortie.

Plusieurs de ces codes peuvent être spécifiés en un seul appel à ioctl: les valeurs sont simplement «ou» combinées. Si l'option RAW est sélectionnée, aucune des autres options n'a d'effet. Lorsque la console est en mode RAW, l'entrée de la console présente les caractéristiques suivantes :

Si CBREAK est sélectionné et que RAW ne l'est pas, l'entrée console présente les caractéristiques suivantes :

Si ni RAW ni CBREAK ne sont sélectionnés, un mode est sélectionné étant soit similaire soit identique au mode par défaut décrit ci-dessus. Si CRMOD est défini, le mode est identique. Sinon, la seule différence est que la conversion du retour chariot en retour à la ligne en entrée et la conversion du retour à la ligne en retour chariot - la séquence de saut de ligne en sortie ne se produit pas. Comme mentionné ci-dessus, lorsque la console est en mode RAW ou CBREAK sans mode ECHO, une demande de lecture à la console renverra toujours au moins un caractère, mais se terminera sans avoir lu le nombre spécifié de caractères si un caractère n'est pas reçu dans un certain intervalle. En fait, seule la demande de lecture sans tampon peut expirer : les fonctions d'entrée/sortie standard sont mise en oeuvre de telle manière qu'elles renvoient le nombre de caractères demandé. Par exemple, lorsque la console est en RAW ou CBREAK sans mode ECHO :

read(fd, buf, 80)

renvoie toujours au moins un caractère, mais peut ne pas renvoyer tous les 80 si l'opérateur retarde trop longtemps entre les touches suivantes. Avec la console toujours dans un mode de temporisation :

getc(fp)

dirigé vers la console renverra toujours un caractère, et :

gets(buf,80,fp)

renverra toujours une ligne entière de caractères.

Exemples

Entrée de la console en utilisant le mode par défaut

Le programme suivant copie les caractères de stdin vers stdout. La console est en mode par défaut, et en supposant que ces flux de données n'ont pas été redirigés par l'opérateur, le programme lira à partir du clavier et écrira sur l'écran. Dans ce mode, l'opérateur peut utiliser les fonctions d'édition de ligne du système d'exploitation, telles que le retour arrière, et les caractères saisis sur le clavier seront renvoyés à l'écran. Les caractères saisis ne seront pas renvoyés au programme tant que l'opérateur n'appuie pas sur le retour chariot.

#include "stdio.h"
#include "sgtty.h"

main() {
int c;
while((c = getchar()) != EOF) putchar(c);
}

Entrée console - mode RAW

Dans cet exemple, un programme ouvre la console pour les entrées/sorties standard, définit la console en mode RAW et se met en boucle, en attendant que les caractères soient lus à partir de la console, puis en les traitant. Les caractères tapés par l'opérateur ne sont pas affichés sauf si le programme lui-même les affiche. La demande d'entrée ne se terminera pas tant qu'un caractère n'est pas reçu. Cet exemple suppose que la console s'appelle 'con:'; sur les systèmes pour lesquels ce n'est pas le cas, remplacez simplement le nom approprié.

#include "stdio.h"
#include "sgtty.h"
main () {
int c;
FILE *fp;
struct sgttyb stty;
if((fp = fopen("con:","r") == NULL) {
printf("Ne peut pas ouvrir la console\n");
exit();
}
stty.sg_flags = RAW;
ioctl(fileno(fp),TIOCSETP,&stty);
}

Entrée console - console en mode CBREAK + ECHO

Cet exemple modifie le programme précédent afin que les caractères lus à partir de la console soient automatiquement renvoyés à l'écran. Le programme accède à la console via le périphérique d'entrée standard. Il utilise la fonction isatty pour vérifier que stdin est associé à la console; si ce n'est pas le cas, le programme rouvre stdin sur la console en utilisant la fonction freopen. Là encore, la console est supposée être nommée 'con:'.

#include "stdio.h"
#include "sgtty.h"
main () {
int c;
struct sgttyb stty;
if(!isatty(stdin)) freopen("con:","r",stdin);
stty.sg_flags = CBREAK | ECHO;
ioctl(0,TIOCSETP,&stty);
for(;;) {
c = getchar();
/* ... */
}
}


Dernière mise à jour : Dimanche, le 15 octobre 2017