我正在备考考试,对Unix(例如curses)中的规范输入/输出和非规范输入/输出工作方式感到困惑。我知道有一个缓冲区用于应用“行纪律”进行规范输入。这是否意味着非规范输入将绕过缓冲区,还是仅表示不会应用任何行纪律?这个过程在输入和输出操作中有何区别?
在我使用的演示规范输入的curses程序中,用户输入的内容会在键入一定数量的字符或经过一定的时间后自动输入。这些是否被视为“行纪律”,还是完全不同的东西?
read()
系统调用,整行将可用于读取(通过一个或多个read()
调用)。vi
或vim
或其他什么——您按下一个字符,它立即可供程序使用。您不必等到按下回车键。系统不会编辑字符;只要键入,它们就可以供程序使用。由程序适当地解释事情。现在,vim
确实做了许多看起来有点像规范输入的事情。例如,退格键向后移动,并且在输入模式下删除了原来的内容。但那是因为vim
选择使其行为如此。在一条评论中,TitaniumDecoy问道:
因此,在非规范化输入中,输入缓冲区是否完全被绕过?此外,行纪律在哪里发挥作用?
对于非规范化输入,仍然使用输入缓冲区;如果没有程序通过read()
调用等待从终端接收输入,则字符将保存在输入缓冲区中。不会发生任何编辑输入缓冲区的情况。
行纪律是诸如输入编辑执行的操作集之类的东西。因此,行纪律的一个方面是删除字符在规范化输入模式下擦除先前的字符。如果设置了icase
(输入大小写映射),则大写字符会被映射为小写字符,除非其前面有反斜杠;我认为这是行纪律或行纪律的一个方面。
read()
”;如果没有累积的输入(如果您在一行的开头键入Control-D),则read()
将返回零字节,然后被程序解释为EOF。当然,在此之后,您可以在键盘上轻松地输入更多字符,而忽略EOF(或以非规范模式运行的程序)的程序也会很高兴。