unix – 规范与非规范终端输入

前端之家收集整理的这篇文章主要介绍了unix – 规范与非规范终端输入前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在攻读考试,我对Unix中的规范与非规范输入/输出如何工作感到困惑(例如,诅咒)。我理解有一个缓冲区,“线路规则”应​​用于规范输入。这是否意味着缓冲区被绕过非规范输入,或者它只是意味着没有应用线规程?这个过程对于输入和输出操作如何不同?

在我使用的curses程序中,我演示了规范的输入,用户输入的输入在一定数量的字符输入或一定时间过去后自动输入。这些东西是否被认为是“线路学科”,还是完全是这些东西?

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

对于非规范输入 – 认为vi或vim或任何 – 你按一个字符,它立即可用于程序。你不会被阻止,直到你回到。系统不对字符进行编辑;它们在输入后立即提供给程序。这是由程序来适当地解释事情。现在,vim做了一些看起来有点像规范输入的东西。例如,backspace向后移动,在输入模式下擦除那里的内容。但是这是因为vim选择使它的行为像这样。

规范和非规范的产出是一个不太严重的业务。有几个位和片段的差异,与是否在回线之前回波回车,和是否做延迟(没有必要与电子;重要的是在输出设备可能是一个110-波特电传)。它也可以做事情,如处理不区分大小写的输出设备 – 电传。小写字母输出为大写,大写字母输出为反斜线和大写。

过去,如果您在登录提示符下键入所有大写字母,那么登录程序将自动转换为在每个实际资本前面输入所有上限的模式,并使用反斜杠。我怀疑这不再在电子终端上做。

在一个评论,TitaniumDecoy问:

So with non-canonical input,is the input buffer bypassed completely? Also,where do line disciplines come in?

使用非规范输入,输入缓冲区仍在使用;如果没有具有等待从终端输入的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编程书(至少,好的)也将覆盖它。

猜你在找的Bash相关文章