我正在攻读考试,我对Unix中的规范与非规范输入/输出如何工作感到困惑(例如,curses)。我知道有一个缓冲区,“行规则”应用于规范输入。这是否意味着缓冲区被旁路用于非规范输入,还是仅仅意味着没有应用线路规则?输入和输出操作的这个过程有何不同?
在我使用的curses程序中演示了规范输入,用户输入的输入会在输入一定数量的字符或经过一定时间后自动输入。这些事情中的任何一个都被视为“线条学科”还是完全不同于其他事情?
答案 0 :(得分:76)
对于规范输入 - 想想shell;实际上,想想老式的Bourne shell,因为Bash和亲戚都有命令行编辑。你键入一行输入;如果你犯了错误,你使用擦除字符(默认为 Backspace ,通常;有时删除)来擦除前一个字符。如果你完全陷入困境,你可以使用行杀死字符取消整行(不完全标准化,通常是 Control-X )。在某些系统上,您可以使用 Control-W 进行单词擦除。所有这些都是规范的输入。收集并编辑整行,直到行尾字符 - Return - 被按下。于是,整条线路可供等待的节目使用。根据未完成的read()
系统调用,可以读取整行(通过一次或多次调用read()
)。
对于非规范输入 - 请考虑vi
或vim
或其他 - 您按下一个字符,它立即可供该程序使用。在你回归之前,你不会被耽搁。系统不对字符进行编辑;键入后,它们即可供程序使用。程序可以适当地解释事物。现在,vim
确实做了许多看起来有点像规范输入的事情。例如,退格键向后移动,并在输入模式下删除那里的内容。但那是因为vim
选择让它表现得那样。
规范和非规范输出是一项不太严肃的业务。有一些不同之处,与是否在线路馈送之前回显回车,以及是否延迟(电子设备不需要;在输出设备可能是110-的时候很重要)有关。波特电传)。它还可以执行诸如处理不区分大小写的输出设备之类的操作 - 再次进行远程处理。小写字母以大写字母输出,大写字母以反斜杠和大写字母输出。
过去,如果您输入所有大写字母到登录提示符,那么登录程序将自动转换为所有大写字母输出的模式,每个实际大写前面都有反斜杠。我怀疑在电子终端上不再这样做了。
在评论中,TitaniumDecoy问道:
因此,对于非规范输入,输入缓冲是否完全被绕过?此外,线路规则在哪里进来?
使用非规范输入时,仍然使用输入缓冲区;如果没有read()
调用的程序等待来自终端的输入,则字符保存在输入缓冲区中。没有发生的是输入缓冲区的任何编辑。
线条规则就像输入编辑所做的操作集。因此,行规则的一个方面是擦除字符在规范输入模式中擦除先前字符。如果设置了icase
(输入大小写映射),则大写字符将映射为小写,除非前面加上反斜杠;我相信这是一门线路学科,或者是线路学科的一个方面。
我忘了提到EOF处理( Control-D )是在规范模式下处理的;它实际上意味着'使累积输入可用于read()
';如果没有累积输入(如果在行的开头键入 Control-D ),则read()
将返回零字节,然后由程序将其解释为EOF。当然,之后您可以在键盘上快速键入更多字符,忽略EOF(或以非规范模式运行)的程序将非常高兴。
当然,在规范模式下,键盘上键入的字符通常会回显到屏幕上;您可以控制是否发生回声。然而,这与规范输入有些相关;即使关闭回声,也会进行正常编辑。
类似地,中断和退出信号是规范模式处理的假象。作业控制信号如 Control-Z 也会挂起当前进程并返回shell。同样,流量控制( Control-S , Control-Q 停止并开始输出)由规范模式提供。
Rochkind的Advanced Unix Programming, 2nd Edn第4章涵盖了终端I / O并提供了大量此类信息 - 还有更多内容。其他UNIX编程书籍(至少是好的)也将涵盖它。