Module de discipline de ligne (ldterm)
La discipline de ligne ldterm est la discipline de ligne commune pour les terminaux.
Cette discipline de ligne est compatible avec POSIX et garantit également la compatibilité avec l'interface BSD. Cette dernière discipline n'est prise en charge que pour la compatibilité avec les applications plus anciennes. Pour des raisons de portabilité, il est fortement recommandé d'utiliser l'interface POSIX dans les nouvelles applications.
Cette section décrit les fonctions fournies par la discipline de ligne ldterm . Pour plus d'informations sur le contrôle de ldterm, voir "termios.h File" dans Files Reference
Lisez ce qui suit pour en savoir plus sur la discipline de ligne ldterm :
Paramètres de terminal
Les paramètres qui contrôlent certaines caractéristiques d'E-S de terminal sont spécifiés dans la structure termios , comme défini dans le fichier termios.h . La structure termios inclut (sans s'y limiter) les membres suivants:
- tcflag_t c_iflag
- Modes d'entrée
- tcflag_t c_oflag
- Modes de sortie
- tcflag_t c_cflag
- Modes de contrôle
- tcflag_t c_lflag
- Modes locaux
- cc_t c_cc[NCCS]
- Caractères de contrôle.
:NONE.tcflag_tetcc_tLes types entiers non signés sont définis dans le fichier termios.h . Le symbole NCCS est également défini dans le fichier termios.h .
Gestion des sessions de groupe de processus (contrôle des travaux)
Un terminal de contrôle distingue un groupe de processus dans la session à laquelle il est associé comme groupe de processus d'avant-plan. Tous les autres groupes de processus de la session sont désignés comme groupes de processus d'arrière-plan. Le groupe de processus de premier plan joue un rôle particulier dans la gestion des signaux.
Les processus de l'interpréteur de commandes qui prennent en charge le contrôle des travaux, tels que le shell Korn (commande ksh ) et le shell C (commande csh ), peuvent allouer le terminal à différents travauxou groupes de processus, en plaçant des processus connexes dans un seul groupe de processus et en associant ce groupe de processus au terminal. Le groupe de processus d'avant-plan d'un terminal peut être défini ou examiné par un processus, en supposant que les conditions d'autorisation sont remplies. Le pilote de terminal aide à l'allocation de travaux en limitant l'accès au terminal par des processus qui ne figurent pas dans le groupe de processus d'avant-plan.
Contro d'accès au terminal
Si un processus qui ne fait pas partie du groupe de processus d'avant-plan de son terminal de contrôle tente de lire à partir du terminal de contrôle, le groupe de processus de ce processus reçoit un signal SIGTTIN . Toutefois, si le processus de lecture ignore ou bloque le signal SIGTTIN, ou si le groupe de processus du processus de lecture est orphelin, la requête de lecture renvoie la valeur -1, attribue la valeur EIO à la variable globale errno et n'envoie pas de signal.
Si un processus qui ne fait pas partie du groupe de processus d'avant-plan de son terminal de contrôle tente d'écrire dans le terminal de contrôle, le groupe de processus de ce processus reçoit un signal SIGTTOU . Toutefois, la gestion du signal SIGTTOU dépend de l'indicateur TOSTOP défini dans lec_lflagde la structure termios . Si l'indicateur TOSTOP n'est pas défini, ou si l'indicateur TOSTOP est défini et que le processus ignore ou bloque le signal SIGTTOU , le processus est autorisé à écrire dans le terminal, et le signal SIGTTOU n'est pas envoyé. Si l'indicateur TOSTOP est activé, que le groupe de processus du processus d'écriture est orphelin et que le processus d'écriture n'ignore pas ou ne bloque pas le signal SIGTTOU, la demande d'écriture renvoie la valeur -1, attribue la valeur EIO à la variable globale errno et n'envoie pas de signal.
Certaines fonctions qui définissent les paramètres de terminal (tcsetattr, tcsendbreak, tcflowet tcflush) sont traitées de la même manière que les demandes d'écriture, sauf que l'indicateur TOSTOP est ignoré. L'effet est identique à celui des demandes d'écriture de terminal lorsque l'indicateur TOSTOP est défini.
Lecture des données et traitement des entrées
Deux types généraux de traitement d'entrée sont disponibles, selon que le fichier de terminal est en mode canonique ou non canonique. En outre, les caractères d'entrée sont traités en fonction de lac_iflagetc_lflagzones. Ce traitement peut inclure l' écho, ou la transmission des caractères d'entrée immédiatement au terminal qui les a envoyés. L'échos est utile pour les terminaux qui peuvent fonctionner en mode duplex intégral.
Une demande de lecture peut être traitée de deux manières, selon que l'indicateur O_NONBLOCK est défini par une sous-routine open ou fcntl . Si l'indicateur O_NONBLOCK n'est pas défini, la demande de lecture est bloquée jusqu'à ce que les données soient disponibles ou qu'un signal soit reçu. Si l'indicateur O_NONBLOCK est défini, la demande de lecture est exécutée, sans blocage, de l'une des trois manières suivantes:
- Si le nombre de données disponibles est suffisant pour satisfaire l'intégralité de la demande, la demande de lecture aboutit et renvoie le nombre d'octets lus.
- S'il n'y a pas assez de données disponibles pour satisfaire l'intégralité de la demande, la demande de lecture aboutit, après avoir lu autant de données que possible, et renvoie le nombre d'octets qu'elle a pu lire.
- Si aucune donnée n'est disponible, la demande de lecture renvoie la valeur " -1 et attribue la valeur " EAGAIN" à la variable globale " errno.
La disponibilité des données varie selon que le mode de traitement d'entrée est canonique ou non canonique. Les modes canonique ou non canonique peuvent être définis à l'aide de la commande stty .
Traitement des entrées en mode canonique
Traitement d'entrée en mode canonique (indicateurICANON défini dansc_lflagzone de la structure termios ), l'entrée du terminal est traitée en unités de lignes. Une ligne est délimitée par un caractère de nouvelle ligne (LF ASCII), un caractère de fin de fichier (EOF) ou un caractère de fin de ligne (EOL). Cela signifie qu'un programme qui tente de lire est bloqué jusqu'à ce qu'une ligne entière ait été tapée ou qu'un signal ait été reçu. De plus, quel que soit le nombre de caractères indiqué dans la demande de lecture, une seule ligne est renvoyée. Il n'est cependant pas nécessaire de lire une ligne entière à la fois. N'importe quel nombre de caractères peut être spécifié dans une demande de lecture sans perdre d'informations. Au cours de l'entrée, le processus d'effacement et d'arrêt est effectué.
- Caractère ERASE
- (Retour arrière, par défaut) efface le dernier caractère saisi
- Caractère WERASE
- (Séquence de touches Ctrl-W, par défaut) efface le dernier mot saisi dans la ligne en cours, mais pas les espaces ni les tabulations précédents
(Un mot est défini comme une séquence de caractères non blancs ; les tabulations sont considérées comme des blancs.) Ni le caractère ERASE ni le caractère WERASE ne s'efface au-delà du début de la ligne.
- Caractère KILL
- (séquence Ctrl-U, par défaut) supprime la totalité de la ligne d'entrée et, en option, génère un caractère de nouvelle ligne
Tous ces caractères fonctionnent sur une base de frappe, indépendamment de tout espacement arrière ou tabulation qui aurait pu être effectué.
- Caractère REPRINT
- (séquence Ctrl-R, par défaut) imprime une nouvelle ligne suivie des caractères de la ligne précédente qui n'ont pas été lus
La réimpression se produit également automatiquement si les caractères qui seraient normalement effacés de l'écran sont encrassés par la sortie du programme. Les caractères sont réimprimés comme s'ils étaient répercutés. Par conséquent, si l'indicateur ECHO n'est pas défini dans lec_lflagde la structure termios , les caractères ne sont pas imprimés. Les caractères ERASE et KILL peuvent être entrés littéralement en les faisant précéder du caractère d'échappement \ (barre oblique inversée), auquel cas le caractère d'échappement n'est pas lu. Les caractères ERASE, WERASE et KILL peuvent être modifiés.
Traitement des entrées en mode non canonique
Traitement d'entrée en mode non canonique (indicateur-ICANON défini dansc_lflagzone de la structure termios ), les octets d'entrée ne sont pas assemblés en lignes et le traitement d'effacement et d'arrêt n'a pas lieu.
- MIN
- Représente le nombre minimal d'octets qui doivent être reçus lorsque la demande de lecture aboutit
- PÉRIODE
- Un temporisateur de granularité 0.1-second utilisé pour les transmissions de données en rafale et à court terme
Les valeurs des membres MIN et TIME de lac_ccsont utilisés pour déterminer comment traiter les octets reçus. Les valeurs MIN et TIME peuvent être définies à l'aide de la commande stty . MIN et MAX ont des valeurs comprises entre 0 et 265. Les quatre combinaisons possibles pour MIN et TIME et leurs interactions sont décrites dans les paragraphes suivants.
Cas A: MIN0, TIME0
Dans ce cas, TIME sert de temporisateur interoctet, qui est activé après la réception du premier octet et réinitialisé à chaque réception d'un octet. Si des octets MIN sont reçus avant l'expiration du temporisateur interoctet, la demande de lecture est satisfaite. Si le temporisateur expire avant la réception des octets MIN, les caractères reçus à ce point sont renvoyés à l'utilisateur. Si TIME expire, au moins un octet est renvoyé. (Le temporisateur n'aurait pas été activé si un octet n'avait pas été reçu.) L'opération de lecture se bloque jusqu'à ce que les mécanismes MIN et TIME soient activés par la réception du premier octet ou jusqu'à ce qu'un signal soit reçu.
Cas B: MIN0, TIME = 0
Dans ce cas, seul MIN est significatif ; le temporisateur n'est pas significatif (la valeur de TIME est 0). Une demande de lecture en attente n'est pas satisfaite (blocs) tant que les octets MIN n'ont pas été reçus ou tant qu'un signal n'a pas été reçu. Un programme qui utilise ce cas pour lire des entrées-sorties de terminal basées sur des enregistrements peut bloquer indéfiniment l'opération de lecture.
Cas C: MIN = 0, TIME0
Dans ce cas, comme la valeur de MIN est 0, TIME ne représente plus un temporisateur interoctet. Il sert maintenant de temporisateur de lecture qui est activé dès que la demande de lecture est traitée. Une demande de lecture est satisfaite dès qu'un octet est reçu ou que le temporisateur de lecture arrive à expiration. Notez que si le temporisateur expire, aucun octet n'est renvoyé. Si le temporisateur n'expire pas, la demande de lecture ne peut être satisfaite que si un octet est reçu. Dans ce cas, l'opération de lecture ne se bloque pas indéfiniment, en attendant un octet. Si, après le lancement de la demande de lecture, aucun octet n'est reçu dans la période spécifiée par TIME multipliée par 0.1 secondes, la demande de lecture renvoie la valeur 0, sans lecture de données.
Cas D: MIN = 0, TIME = 0
Dans ce cas, la valeur minimale du nombre d'octets demandés ou du nombre d'octets actuellement disponibles est renvoyée sans attendre que d'autres octets soient entrés. Si aucun caractère n'est disponible, la demande de lecture renvoie la valeur 0, sans lecture de données.
Les cas A et B existent pour gérer l'activité en mode rafale, comme les programmes de transfert de fichiers, où un programme doit traiter au moins le nombre de caractères spécifié par la variable MIN à la fois. Dans le cas A, le temporisateur interoctet est activé comme mesure de sécurité. Dans le cas B, le temporisateur est désactivé.
Les cas C et D existent pour gérer les transferts limités à un seul caractère. Ces cas sont facilement adaptables aux applications à écran qui ont besoin de savoir si un caractère est présent dans la file d'attente d'entrée avant de rafraîchir l'écran. Dans le cas C, le temporisateur est activé. Dans le cas D, le temporisateur est désactivé. Le cas D peut entraîner des problèmes de performances en cas de surutilisation, mais il est préférable de l'utiliser plutôt que de faire une demande de lecture avec la définition de l'indicateur O_NONBLOCK .
Ecriture de données et traitement de sortie
Lorsqu'un ou plusieurs caractères sont écrits, ils sont transmis au terminal dès que des caractères précédemment écrits sont affichés. (Les caractères d'entrée sont répercutés en les plaçant dans la file d'attente de sortie à leur arrivée.) Si un processus produit des caractères plus rapidement qu'ils ne peuvent être affichés, il est suspendu lorsque sa file d'attente en sortie dépasse une certaine limite. Lorsque la file d'attente a atteint un certain seuil, le programme reprend.
Gestion du modem
Si l'indicateur CLOCAL est défini dans lec_cflagde la structure termios , une connexion ne dépend pas de l'état des lignes d'état du modem. Si l'indicateur CLOCAL est effacé, les lignes d'état du modem sont contrôlées. Dans des circonstances normales, une fonction open attend la fin de la connexion du modem. Toutefois, si l'indicateur O_NONBLOCK ou CLOCAL est défini, la fonction d'ouverture est immédiatement renvoyée sans attendre la connexion.
Si l'indicateur CLOCAL n'est pas défini dans lec_cflagune zone de la structure termios et une déconnexion du modem est détectée par l'interface du terminal pour un terminal de contrôle, le signal SIGHUP est envoyé au processus de contrôle associé au terminal. A moins que d'autres dispositions n'aient été prises, ce signal provoque l'arrêt du processus. Si le signal SIGHUP est ignoré ou intercepté, toute demande de lecture ultérieure renvoie une indication de fin de fichier jusqu'à la fermeture du terminal. Toute demande d'écriture ultérieure au terminal renvoie la valeur -1 et affecte la valeur EIO à la variable globale errno jusqu'à ce que le périphérique soit fermé.
Fermeture d'un fichier d'unité de terminal
Le dernier processus de fermeture d'un fichier d'unité de terminal entraîne l'envoi de toute sortie à l'unité et la suppression de toute entrée. Ensuite, si l'indicateur HUPCL est défini dans lec_cflagzone de la structure termios et le port de communication prend en charge une fonction de déconnexion, le terminal effectue une déconnexion.