2008-12-11 103 views
34

我正在学习考试,对于在Unix中canonical与non-canonical输入/输出如何工作(例如curses)我感到困惑。我知道有一个缓冲“线条”适用于规范输入。这是否意味着缓冲区被非规范输入绕过,还是仅仅意味着没有行规则被应用?输入和输出操作的过程如何不同?典型与非典型终端输入

在我使用过的演示规范输入的curses程序中,用户输入的输入会在输入一定数量的字符或经过一定的时间后自动输入。这些事情中的任何一种都被视为“线条规范”还是完全不同?

回答

72

对于规范输入 - 思考壳;实际上,认为好的老式Bourne shell,因为Bash和亲戚都有命令行编辑。你输入一行输入;如果您犯了错误,则使用擦除字符(默认为退格,通常;有时删除)删除前一个字符。如果你完全搞砸了,你可以用行杀字符取消整行(不完全标准化,通常是Control-X)。在某些系统上,您可以使用Control-W进行单词擦除。所有这些都是标准输入。整行收集并编辑,直到行尾字符— 返回 —被按下。于是,整条线路可用于等待节目。根据未完成的read()系统调用,整行可供读取(通过对read()的一个或多个调用)。

对于非规范输入—认为vivim或任何—你按一个字符,它可以立刻提供给程序。在你回归之前,你不会被阻止。系统不会编辑字符;只要输入它们,程序就可以使用它们。这个程序要适当地解释事情。现在,vim的确做了许多看起来有点像标准输入的东西。例如,退格键向后移动,并在输入模式下删除那里的内容。但那是因为vim选择使其表现如此。

典型和非典型输出是一个不那么严重的业务。这里有一些不同之处,涉及到是否在换行前回显回车,以及是否延迟(电子设备不必要;在输出设备可能是110分钟的时候很重要)波特电传)。它也可以做一些事情,例如再次处理不区分大小写的输出设备— teletypes。小写字母以大写形式输出,大写字母以反斜杠和大写字母形式输出。

它曾经是因为如果您输入所有大写字母到登录提示符,那么登录程序会自动转换到所有大写字母都在每个实际大写字母前加反斜杠输出的模式。我怀疑这不再是在电子终端上完成的。


在评论,TitaniumDecoy问:

因此,与非规范输入,是完全绕过输入缓冲区?此外,线路规程是在哪里进行的?

对于非规范输入,仍然使用输入缓冲区;如果没有read()呼叫等待终端输入的程序,则字符保存在输入缓冲区中。没有发生什么是输入缓冲区的任何编辑。

线条规则就像输入编辑所做的一组操作一样。因此,线条规则的一个方面是,擦除字符会在规范输入模式中擦除前一个字符。如果设置了icase(输入大小写映射),则大写字符将映射为小写,除非前面加反斜杠;这是一条线条规范,我相信,或者线条规范的一个方面。


我忘了提及,EOF处理(控制-d)在规范模式处理;它实际上意味着'使累积输入可用于read()';如果没有累积输入(如果在行的开头键入Control-D),则read()将返回零字节,然后程序将其解释为EOF。当然,你可以在键盘上快乐地键入更多的字符,而忽略EOF(或者以非规范模式运行)的程序会很开心。

当然,在规范模式下,键盘上键入的字符通常会回显到屏幕上;您可以控制是否发生回声。但是,这与标准输入有点切线。即使回声关闭,也会进行正常编辑。

类似地,中断和退出信号是规范模式处理的假象。作业控制信号也是如此,例如Control-Z暂停当前进程并返回到shell。同样,流量控制(Control-S,Control-Q停止并开始输出)由规范模式提供。

Rochkind的Advanced Unix Programming, 2nd Edn的第4章介绍了终端I/O,并提供了大量信息 - 以及更多信息。其他的UNIX编程书籍(至少是好的)也会覆盖它。

+1

因此,对于非规范输入,输入缓冲区是否完全被旁路?此外,线路规程是在哪里进行的? – titaniumdecoy 2008-12-11 03:45:14