2008-12-11 15 views
34

J'étudie pour un examen et je suis confus quant à la façon dont les entrées/sorties canoniques et non-canoniques fonctionnent sous Unix (par exemple, malédictions). Je comprends qu'il y a un tampon auquel les «disciplines de ligne» sont appliquées pour l'entrée canonique. Cela signifie-t-il que le tampon est ignoré pour une entrée non canonique, ou signifie-t-il simplement qu'aucune discipline de ligne n'est appliquée? En quoi ce processus diffère-t-il pour les opérations d'entrée et de sortie?Entrée de terminal canonique contre non-canonique

Dans les curses avec lesquelles j'ai travaillé pour démontrer une entrée canonique, l'entrée tapée par un utilisateur est automatiquement entrée après qu'un certain nombre de caractères ont été tapés ou qu'un certain temps s'est écoulé. Est-ce que l'une de ces choses est considérée comme une «discipline de ligne» ou est-ce autre chose?

Répondre

72

Pour l'entrée canonique - think shell; En fait, pensez à un bon vieux shell Bourne, puisque Bash et ses proches ont une ligne de commande. Vous tapez une ligne d'entrée; Si vous faites une erreur, vous utilisez le caractère d'effacement (par défaut, Retour arrière, en général, parfois Supprimez) pour effacer le caractère précédent. Si vous vous trompez complètement, vous pouvez annuler toute la ligne avec le caractère de suppression de ligne (pas complètement standardisé, souvent Control-X). Sur certains systèmes, vous obtenez un mot d'effacement avec Control-W. Tout ceci est une entrée canonique. La ligne entière est rassemblée et éditée jusqu'à la fin du caractère de ligne — Retour — est enfoncé. Là-dessus, toute la ligne est mise à la disposition des programmes en attente. Selon les appels système read() qui sont en attente, la ligne entière sera disponible pour être lu (par un ou plusieurs appels à read()).

Pour l'entrée non-canonique — pense vi ou vim ou quoi que — vous appuyez sur un caractère, et il est immédiatement disponible au programme. Vous n'êtes pas retenu jusqu'à votre retour. Le système n'édite pas les caractères; ils sont mis à la disposition du programme dès qu'ils sont dactylographiés. C'est au programme d'interpréter les choses de façon appropriée. Maintenant, vim fait un certain nombre de choses qui ressemblent un peu à une entrée canonique. Par exemple, le retour arrière recule et, en mode saisie, efface ce qui s'y trouvait. Mais c'est parce que vim choisit de le faire se comporter comme ça.

La sortie canonique et non-canonique est une activité beaucoup moins sérieuse. Il y a quelques différences, liées à des choses telles que l'écho du retour chariot avant le saut de ligne, et s'il faut faire des retards (pas nécessaire avec l'électronique), ce qui est important à l'époque où le périphérique de sortie télétype baud). Il peut également faire des choses comme gérer des périphériques de sortie insensible à la casse —, encore une fois. Les lettres minuscules sont affichées en majuscules et les lettres majuscules en tant que contre-obliques et majuscules. Autrefois, si vous tapiez toutes les lettres majuscules dans l'invite de connexion, le programme de connexion se convertissait automatiquement en mode où toutes les majuscules étaient imprimées avec une barre oblique inversée en regard de chaque capital réel. Je soupçonne que cela n'est plus fait sur les terminaux électroniques.


Dans un commentaire, TitaniumDecoy demandé:

Donc, avec l'entrée non-canonique, est le tampon d'entrée complètement contournée? En outre, où les disciplines de ligne entrent-elles?

Avec une entrée non-canonique, le tampon d'entrée est toujours utilisé; S'il n'y a pas de programme avec un appel read() en attente d'une entrée du terminal, les caractères sont conservés dans le tampon d'entrée. Ce qui ne se passe pas, c'est une modification du tampon d'entrée.

Les disciplines de ligne sont des choses comme l'ensemble des manipulations que l'édition d'entrée fait. Ainsi, un aspect de la discipline de ligne est que le caractère d'effacement efface un caractère antérieur en mode d'entrée canonique. Si vous avez défini icase (mappage de cas d'entrée), les caractères majuscules sont mappés en minuscules sauf s'ils sont précédés d'une barre oblique inverse; c'est une discipline de ligne, je crois, ou un aspect d'une discipline de ligne.


j'oublié de mentionner que le traitement de EOF (Control-D) est traitée en mode canonique; cela signifie en fait 'rendre l'entrée accumulée disponible pour read()'; s'il n'y a pas d'entrée accumulée (si vous tapez Control-D au début d'une ligne), le read() renverra zéro octet, ce qui est alors interprété comme EOF par les programmes. Bien sûr, vous pouvez taper joyeusement plus de caractères sur le clavier après cela, et les programmes qui ignorent EOF (ou fonctionner en mode non-canonique) seront très heureux.

Bien sûr, en mode canonique, les caractères tapés au clavier sont normalement renvoyés à l'écran; vous pouvez contrôler si cet écho se produit. Cependant, ceci est quelque peu tangentiel à l'entrée canonique; l'édition normale se produit même lorsque l'écho est désactivé. De même, les signaux d'interruption et de sortie sont des artefacts du traitement en mode canonique. Il en va de même pour les signaux de contrôle de travail tels que Control-Z pour suspendre le processus en cours et revenir au shell. De même, le contrôle de flux (Control-S, Control-Q pour arrêter et démarrer la sortie) est fourni par le mode canonique.

Le chapitre 4 du Advanced Unix Programming, 2nd Edn de Rochkind couvre les E/S du terminal et fournit une grande partie de cette information - et beaucoup plus encore. D'autres livres de programmation UNIX (au moins, les bons) le couvriront également.

+1

Donc, avec une entrée non-canonique, le tampon d'entrée est-il complètement contourné? En outre, où les disciplines de ligne entrent-elles? – titaniumdecoy