Kanonische vs. nicht-kanonische Terminal-Eingabe
Bin ich studieren für eine Prüfung und ich bin verwirrt, als wie kanonisch vs. non-kanonisch Eingabe - /Ausgabe-Werke in Unix (z.B. Flüche). Ich verstehe, dass es einen Puffer, um die "line-Disziplinen" gelten für canonical input. Bedeutet das, dass der Puffer umgangen wird, die für nicht-kanonische Eingang, oder tut es einfach bedeuten, dass keine Zeile Disziplinen angewendet werden? Wie funktioniert dieser Prozess so unterscheiden sich die input-und output-Operationen?
In der curses-Programme, mit denen ich arbeitete, die zeigen, dass canonical input, input eingegeben von einem Benutzer wird automatisch entweder nach einer bestimmten Anzahl von Zeichen eingegeben wurde oder eine bestimmte Zeit vergangen ist. Sind entweder von diesen Dingen als "line-Disziplinen" oder ist dies etwas ganz anderes?
InformationsquelleAutor der Frage titaniumdecoy | 2008-12-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für canonical input — denken Schale; eigentlich, finde den guten alten Bourne-shell, da Bash und verwandten haben die command-line editing. Geben Sie ein Linie-Eingang, wenn Sie einen Fehler machen, verwenden Sie die erase-Zeichen (Standardeinstellung ist Backspacein der Regel; manchmal Löschen) zum löschen des vorherigen Zeichens. Wenn Sie mess up komplett, Sie können Abbrechen, die ganze Zeile mit der Zeile, töten Charakter (nicht vollständig standardisiert, Häufig Strg-X). Auf einigen Systemen, erhalten Sie ein Wort löschen mit Ctrl-W. All dies ist canonical input. Die gesamte Zeile wird gesammelt und bearbeitet bis zum Ende der Zeile-Zeichen — Zurück — gedrückt wird. Daraufhin wird die gesamte Zeile zur Verfügung steht-warten-Programme. Je nach
read()
system-Aufrufe, die sind hervorragend, die ganze Zeile zur Verfügung stehen werden, gelesen werden (durch eine oder mehrere Anrufe zuread()
).Für "nicht-kanonische" input — denken
vi
odervim
oder was auch immer — Sie drücken einen Charakter, und es ist sofort verfügbar, um das Programm. Sie sind nicht gehalten, bis Sie drücken Sie die EINGABETASTE. Das system führt keine Bearbeitung der Charaktere; Sie sind zur Verfügung gestellt, um das Programm so schnell wie Sie geschrieben sind. Es ist bis zu das Programm zu interpretieren, angemessen. Jetztvim
hat eine Anzahl von Sachen tun, die sehen ein bisschen aus wie canonical input. Zum Beispiel, backspace bewegt sich rückwärts, und im input-Modus löscht, was da war. Aber das ist, weilvim
wählt, um das es sich so Verhalten, dass.Kanonischen und nicht-kanonischen Ausgabe ist ein viel weniger ernste Sache. Es gibt ein paar Stücke von der Unterschied, in Bezug auf Dinge wie, ob echo carriage-return, bevor Sie line-feed, und ob Verzögerungen (nicht notwendig mit Elektronik; wichtig in den Tagen, wenn das Ausgabe-Gerät haben könnte, war ein 110 baud teletype). Es können auch Dinge tun, wie behandeln von groß-und Kleinschreibung output — Geräte- teletypes, wieder. Kleinbuchstaben sind in der Ausgabe in Großbuchstaben und Großbuchstaben als backslash und caps.
Es so, dass, wenn Sie eingegeben haben alle Großbuchstaben auf der login-prompt, dann wird das login-Programm würde automatisch zu konvertieren, um den Modus all caps waren eine Ausgabe mit einem backslash vor jedem eigentlichen Hauptstadt. Ich vermute, dass dies nicht mehr geschieht auf elektronischen terminals.
In einem Kommentar, TitaniumDecoy fragte:
Mit nicht-kanonischen Eingang, der Eingabepuffer wird noch verwendet; wenn es kein Programm mit einer
read()
Anklopfen für die Eingabe von dem terminal, die Charaktere sind gehalten, die im input-Puffer. Was nicht passiert, ist eine Bearbeitung der input-buffer.Line-Disziplinen sind Dinge wie die Reihe von Manipulationen, die die Eingabe Bearbeitung hat. So, ein Aspekt der Linie Disziplin ist, dass Sie die erase-Zeichen löscht eine Vorherige Charakter in kanonische Eingabemodus. Wenn Sie
icase
(input-case-mapping) gesetzt, dann wird groß- /Kleinschreibung Zeichen zugeordnet sind, die-und Kleinschreibung, es sei denn mit einem vorangestellten backslash; das ist eine Linie, Disziplin, glaube ich, oder ein Aspekt einer Linie Disziplin.Ich vergaß zu erwähnen, dass EOF-Verarbeitung (Ctrl-D) behandelt wird im kanonischen Modus; es bedeutet eigentlich 'den kumulierten input zur Verfügung
read()
'; wenn es keine angesammelte Eingang (wenn Sie geben Sie Strg-D an den Anfang der Zeile), dann dieread()
zurück-null-bytes, die dann interpretiert werden als EOF durch die Programme. Natürlich können Sie fröhlich weiter mehr Zeichen auf der Tastatur nach, dass und Programme, die ignorieren EOF (oder laufen in nicht-kanonischen Modus) wird ganz glücklich.Natürlich im kanonischen Modus werden die eingegebenen Zeichen auf der Tastatur sind normalerweise auf dem Bildschirm zurückgegeben werden; Sie können bestimmen, ob das echo Auftritt. Dies ist jedoch etwas tangential in Bezug auf canonical-Eingang, der normale Bearbeitung tritt auch auf, wenn echo ausgeschaltet ist.
Ähnlich, die interrupt-und quit-Signale sind Artefakte der kanonische Modus der Verarbeitung. So sind auch die job-control-Signale, wie Sie Ctrl-Zum die weitere Ausführung des Laufenden Prozesses und Rückkehr zur shell. Ebenfalls, flow control (Ctrl-SCtrl-Qum zu stoppen und start-Ausgang) vorgesehen ist, anhand kanonischer Modus.
Kapitel 4 Rochkind s Advanced Unix Programming, 2nd Edn deckt terminal I/O und gibt viel Informationen — und eine ganze Menge mehr. Andere UNIX-Programmierung-Bücher (zumindest die guten) deckt Sie auch.
InformationsquelleAutor der Antwort Jonathan Leffler