Question

Je suis en train d'étudier pour un examen et je suis confus quant à la façon dont l'entrée canonique par rapport aux non-canonique / sortie fonctionne sous Unix (par exemple, les malédictions). Je crois qu'il y a un tampon « dans laquelle les disciplines de ligne » sont appliqués à l'entrée canonique. Est-ce que cela signifie que la mémoire tampon est contournée pour l'entrée non-canonique, ou que cela signifie simplement qu'il n'y a pas de ligne sont des disciplines appliquées? Comment ce processus diffère des opérations d'entrée et de sortie?

Dans les programmes de malédictions j'ai travaillé avec cette démonstration entrée canonique, l'entrée typée par un utilisateur est automatiquement entré soit après un certain nombre de caractères ont été dactylographié ou une certaine quantité de temps a passé. Est-ce l'une de ces choses considérées comme des « disciplines de ligne » ou est-ce autre chose?

Était-ce utile?

La solution

Pour l'entrée canonique - pensez shell; en fait, pensez bien Bourne shell ancienne, depuis Bash et parents ont l'édition en 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 est Backspace , le plus souvent, parfois Supprimer ) 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 tout à fait normalisée, souvent Control-X ). Sur certains systèmes, vous obtenez un mot effacement avec Control-W . Tout cela est entrée canonique. La ligne entière est recueillie et éditée jusqu'à la fin de caractère de ligne - Retour - est pressé. Là-dessus, toute la ligne est mis à la disposition des programmes d'attente. En fonction des appels système qui sont en circulation read(), toute la ligne sera disponible pour être lu (par un ou plusieurs appels à vi).

Pour l'entrée non-canonique - ou penser vim ou quoi que icase - vous appuyez sur un caractère, et il est immédiatement disponible au programme. Vous n'êtes pas tenu jusqu'à ce que vous frappez retour. Le système ne fait pas l'édition des caractères; ils sont mis à la disposition du programme dès qu'ils sont typés. Il appartient au programme d'interpréter les choses de façon appropriée. Maintenant, ne fait un <=> certain nombre de choses qui ont l'air un peu comme entrée canonique. Par exemple, backspace déplace vers l'arrière, et en mode d'entrée efface ce qui était là. Mais c'est parce que choisit de faire <=> se comporter comme ça.

Sortie canonique et non canonique est une entreprise beaucoup moins grave. Il y a quelques morceaux de différence, liées à des choses comme si l'écho-retour chariot avant la ligne d'alimentation, et si faire des retards (pas nécessaire avec l'électronique important dans les jours où le dispositif de sortie aurait pu être un 110- transmission téléscripteur). Il peut aussi faire des choses comme la poignée des dispositifs de sortie sensibles à la casse - téléscripteurs, encore une fois. Les lettres minuscules sont sorties en majuscules et lettres majuscules comme backslash et majuscules.

Il fut un temps que si vous avez saisi toutes les lettres majuscules à l'invite de connexion, le programme de connexion se convertir automatiquement au mode où tous les bouchons étaient sortie avec une barre oblique inverse devant chaque capital réel. Je soupçonne que cela ne se fait plus sur les terminaux électroniques.


Dans un commentaire, TitaniumDecoy a demandé:

  

Donc, avec l'entrée non-canonique, est le tampon d'entrée complètement contournée? En outre, lorsque la ligne ne disciplines viennent en?

Avec entrée non canonique, la mémoire tampon d'entrée est toujours utilisé; s'il n'y a pas de programme avec un appel <=> attente d'entrée à partir du terminal, les caractères sont maintenus dans la mémoire tampon d'entrée. Ce qui ne se produit pas est une édition de la mémoire tampon d'entrée.

Les disciplines de ligne sont des choses comme l'ensemble des manipulations que l'édition d'entrée ne. Ainsi, un aspect de la discipline de ligne est que le caractère d'effacement efface un caractère avant en mode d'entrée canonique. Si vous avez <=> (cas-mapping d'entrée) de jeu, alors les caractères majuscules sont mis en correspondance en minuscules sauf si précédée d'une barre oblique inverse; qui est une discipline de ligne, je crois, ou un aspect d'une discipline de ligne.


I oublié de mentionner que le traitement de EOF ( Control-D ) est traitée en mode canonique; cela signifie réellement « faire l'entrée accumulée disponible pour <=> »; s'il n'y a pas d'entrée accumulée (si vous tapez Control-D au début d'une ligne), le renverra zéro <=> octets, qui est alors interprété comme EOF par les programmes. Bien sûr, vous pouvez taper allègrement plus de caractères sur le clavier après, et des programmes qui ne tiennent pas compte EOF (ou exécuter en mode non canonique) sera très heureux.

Bien sûr, en mode canonique, les caractères tapés au clavier sont normalement résonnaient à l'écran; vous pouvez contrôler si ce faisant écho se produit. Cependant, cela est un peu tangente à l'entrée canonique; l'édition normale se produit même si l'écho est désactivé.

De même, l'interruption d'und arrêter de signaux sont des éléments de traitement en mode canonique. Sont aussi les signaux de commande de travail tels que Ctrl-Z pour suspendre le processus en cours et revenir à la coquille. De même, le contrôle de flux ( Control-S , Control-Q pour arrêter et démarrer la sortie) est prévu selon le mode canonique.

Chapitre 4 Programmation Unix Advanced Rochkind, 2ème Edn couvre la borne I / O et donne une grande partie de ces informations - et beaucoup plus. D'autres livres de programmation UNIX (au moins, les bons) couvriront également.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top