我正在准备考试,我很困惑如何规范和规范。非规范输入/输出在 Unix 中工作(例如,curses)。我知道有一个缓冲区可以应用“行规则”来进行规范输入。这是否意味着非规范输入会绕过缓冲区,或者只是意味着不应用任何线路规则?此过程对于输入和输出操作有何不同?

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

有帮助吗?

解决方案

对于规范输入——想想 shell;实际上,考虑一下老式的 Bourne shell,因为 Bash 和亲戚都有命令行编辑功能。您键入一行输入;如果你犯了一个错误,你可以使用擦除字符(默认是 退格键, , 通常;有时 删除) 删除前一个字符。如果你完全搞砸了,你可以用 linekill 字符取消整行(不完全标准化,通常 控制-X)。在某些系统上,您可以使用以下命令擦除单词 控制-W. 。所有这些都是规范输入。整行被收集和编辑,直到行字符结束 - 返回 — 被按下。随后,整条线路可供等待程序使用。取决于 read() 未完成的系统调用,整行将可供读取(通过一次或多次调用 read()).

对于非规范输入——思考 vi 或者 vim 或者其他什么——你按下一个字符,程序就会立即使用它。在您按回车键之前,您不会被耽搁。系统不对字符进行编辑;它们一输入就可供程序使用。由程序来适当地解释事物。现在, vim 确实做了一些看起来有点像规范输入的事情。例如,退格键向后移动,并且在输入模式下擦除那里的内容。但那是因为 vim 选择让它表现得像那样。

规范和非规范输出并不是那么重要的事情。有一些细微的差别,涉及到是否在换行之前回车以及是否进行延迟(对于电子设备来说不是必需的;这在输出设备可能是 110 波特电传打字机的时代很重要)。它还可以做一些事情,比如处理不区分大小写的输出设备——同样是电传打字机。小写字母以大写形式输出,大写字母以反斜杠和大写形式输出。

过去,如果您在登录提示中输入所有大写字母,那么登录程序会自动转换为所有大写字母都输出的模式,并在每个实际大写字母前面加上反斜杠。我怀疑电子终端不再这样做了。


TitaniumDecoy 在评论中问道:

那么对于非规范输入,输入缓冲区是否完全被绕过?另外,生产线纪律从何而来?

对于非规范输入,仍然使用输入缓冲区;如果没有程序 read() 调用等待来自终端的输入,字符保存在输入缓冲区中。不会发生对输入缓冲区的任何编辑。

线条规则类似于输入编辑所做的一组操作。因此,行规则的一个方面是擦除字符在规范输入模式下擦除先前的字符。如果你有 icase (输入大小写映射)设置,则大写字符将映射为小写字符,除非前面有反斜杠;我相信,这是一条生产线纪律,或者说是一条生产线纪律的一个方面。


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

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

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

罗奇金德的第四章 高级 Unix 编程,第二届 涵盖终端 I/O 并提供大部分此类信息 — 以及更多信息。其他 UNIX 编程书籍(至少是好的书籍)也会介绍它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top