规范与非规范终端输入

unix input curses

37824 观看

1回复

12140 作者的声誉

我正在为考试而学习,我对Unix中规范输入与非规范输入/输出的工作方式感到困惑(例如curses)。我知道在规范输入中应用“线规”存在缓冲。这是否意味着为非规范输入绕过了缓冲区,还是仅意味着未应用行规?此过程对于输入和输出操作有何不同?

在我使用过的演示标准输入的curses程序中,在键入一定数量的字符或经过一定时间后,会自动输入由用户键入的输入。这些事情是否被视为“学科”或完全是其他东西?

作者: titaniumdecoy 的来源 发布者: 2008 年 12 月 11 日

回应 1


80

598354 作者的声誉

决定

对于规范的输入-考虑外壳;实际上,请考虑使用老式的Bourne Shell,因为Bash和亲戚都可以进行命令行编辑。您输入一行输入;如果输入有误,请使用擦除字符(默认为Backspace,通常为;有时为Delete)擦除前一个字符。如果您完全搞砸了,则可以用行终止符取消整行(通常不是完全标准化的Control-X)。在某些系统上,您会用擦除单词Control-W。所有这些都是规范输入。收集并编辑整行,直到Return按下行末字符-为止。随即,整行可供等待程序使用。根据未完成的read()系统调用,将可以读取整行(通过一个或多个对read())。

对于非规范的输入(例如思考vivim其他),请按一个字符,该字符将立即可供程序使用。直到您按回车键,您才被阻止。系统不编辑字符;键入后即可将其提供给程序。程序可以适当地解释事物。现在,vim确实做了很多看起来像规范输入的事情。例如,退格键向后移动,而在输入模式下则擦除那里的内容。但这是因为vim选择使其表现为那样。

规范和非规范输出的重要性要小得多。两者之间存在一些细微的差异,例如是否在换行之前回送回车符以及是否进行延迟(对于电子设备而言不是必需的;在输出设备可能是110-波特电传)。它也可以做类似不区分大小写的输出设备(电传打字机)之类的事情。小写字母以大写字母输出,大写字母以反斜杠和大写字母输出。

过去,如果您在登录提示中键入所有大写字母,则登录程序将自动转换为输出所有大写字母且每个实际大写字母前面都带有反斜杠的模式。我怀疑这不再在电子终端上完成。


在评论中,TitaniumDecoy问:

因此,对于非规范输入,输入缓冲区是否被完全旁路?另外,线路学科从何而来?

对于非规范输入,仍使用输入缓冲区。如果没有程序read()正在等待终端的输入,则这些字符将保留在输入缓冲区中。什么都不会发生,就是对输入缓冲区进行任何编辑。

线规就像输入编辑所做的一组操作一样。因此,行规的一方面是在规范输入模式下擦除字符擦除了先前的字符。如果已设置icase(输入大小写映射),则大写字符将映射为小写,除非在前面加上反斜杠;否则,将大写字符映射为小写。我认为这是一门学科,或者是一门学科。


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

当然,在规范模式下,通常会在键盘上回显在键盘上键入的字符。您可以控制是否发生回声。但是,这在某种程度上与规范输入相切。即使关闭回声,也会进行常规编辑。

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

Rochkind的Advanced Unix Programming的第4章,第2版Edn涵盖了终端I / O,并提供了许多此类信息-以及更多。其他UNIX编程书籍(至少是好的书籍)也将对此进行介绍。

作者: Jonathan Leffler 发布者: 2008 年 12 月 11 日
32x32