典型与非典型terminalinput

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

在我使用过的示范规范input的curses程序中,在input了一定数量的字符或者经过了一定的时间之后,用户input的input会自动input。 这些事情中的任何一个被认为是“线路规程”,还是完全是其他的东西呢?

对于规范input – 思考壳; 实际上,认为好老式的Bourne shell,因为Bash和亲戚都有命令行编辑。 你input一行input; 如果你犯了一个错误,你使用擦除字符(默认是Backspace ,通常有时删除 )来擦除前一个字符。 如果你完全搞砸了,你可以用行kill字符取消整个行(不完全标准化,通常是Control-X )。 在某些系统上,你用Control-W得到一个字擦除。 这一切都是规范的input。 整行被收集和编辑,直到行字符结束 – 返回 – 被按下。 于是,整个线路可用于等待节目。 根据未完成的read()系统调用,整行将被读取(通过一次或多次调用read() )。

对于非规范input – 想想vivim或其他什么 – 你按一个字符,它立即可用的程序。 在你回来之前,你不会被阻止。 系统不会编辑字符; 一旦input,他们就可以进入程序。 这个程序要适当地解释事情。 现在, vim做了许多看起来有点像标准input的东西。 例如,退格键向后移动,在input模式下,删除那里的内容。 但那是因为vimselect使其performance如此。

典型和非典型输出是一个不那么严重的业务。 还有一些不同点,比如是否在换行前回显回车,是否延迟(电子设备不需要;在输出设备可能是110天的时候很重要)波特电传)。 它也可以处理大小写不敏感的输出设备 – teletypes。 小写字母以大写forms输出,大写字母以反斜杠和大写字母forms输出。

它曾经是,如果你input所有的大写字母的login提示,然后login程序会自动转换为所有大写输出与每个实际资本前面的反斜杠的模式。 我怀疑在电子terminal上不再这样做了。


TitaniumDecoy评论道:

那么在非规范input的情况下,input缓冲区是否完全被旁路? 另外,线路学科在哪里?

使用非规范input时,input缓冲区仍然使用; 如果没有一个read()调用的程序等待来自terminal的input,则字符被保存在input缓冲区中。 什么不发生是input缓冲区的任何编辑。

行规则就像input编辑所做的一系列操作一样。 所以,线条规则的一个方面是,擦除字符在规范input模式中擦除前一个字符。 如果设置了icase (input大小写映射),则大写字符映射为小写,除非前面加反斜杠。 我认为这是一个线条规范,或者是一个线条规范的一个方面。


我忘记提到EOF处理( Control-D )是以规范模式处理的; 它实际上意味着“使累积input可用于read() ”; 如果没有累积的input(如果在一行的开始处键入Control-D ),则read()将返回零字节,然后程序将其解释为EOF。 当然,你可以在键盘上快乐地键入更多的字符,忽略EOF(或者以非规范模式运行)的程序将会非常快乐。

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

同样,中断和退出信号是规范模式处理的假象。 工作控制信号(如Control-Z)也会暂停当前进程并返回到shell。 同样,stream量控制( Control-SControl-Q停止并启动输出)由规范模式提供。

Rochkind的高级Unix编程第四章,第二版涵盖了terminalI / O,并提供了大量的信息 – 以及更多。 其他的UNIX编程书籍(至less是好的)也会覆盖它。